Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

And glBitmap() and a few raster functions #74

Merged
merged 11 commits into from
Oct 6, 2024
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ add_library(${TARGET} STATIC
src/opengx.h
src/pixels.cpp
src/pixels.h
src/raster.cpp
src/selection.c
src/state.h
src/stencil.c
Expand Down
18 changes: 18 additions & 0 deletions src/clip.c
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,24 @@ static void mtx44_multiply(const ClipPlane in, const Mtx44 m, ClipPlane out)
}
}

bool _ogx_clip_is_point_clipped(const guVector *p)
{
if (glparamstate.clip_plane_mask == 0) return false;

for (int i = 0; i < MAX_CLIP_PLANES; i++) {
if (!(glparamstate.clip_plane_mask & (1 << i))) continue;

guVector plane = {
glparamstate.clip_planes[i][0],
glparamstate.clip_planes[i][1],
glparamstate.clip_planes[i][2],
};
if (guVecDotProduct(&plane, p) + glparamstate.clip_planes[i][3] < 0)
return true;
}
return false;
}

void _ogx_clip_setup_tev(int *stages, int *tex_coords,
int *tex_maps, int *tex_mtxs)
{
Expand Down
11 changes: 11 additions & 0 deletions src/clip.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,23 @@ POSSIBILITY OF SUCH DAMAGE.

#include <GL/gl.h>
#include <malloc.h>
#include <ogc/gu.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

void _ogx_clip_enabled(int plane);
void _ogx_clip_disabled(int plane);

void _ogx_clip_setup_tev(int *stages, int *tex_coords,
int *tex_maps, int *tex_mtxs);

bool _ogx_clip_is_point_clipped(const guVector *p);

#ifdef __cplusplus
} // extern C
#endif

#endif /* OPENGX_CLIP_H */
70 changes: 35 additions & 35 deletions src/functions.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ static const ProcMap s_proc_map[] = {
PROC(glBegin),
PROC(glBegin),
PROC(glBindTexture),
//PROC(glBitmap),
PROC(glBitmap),
PROC(glBlendFunc),
PROC(glCallList),
PROC(glCallLists),
Expand Down Expand Up @@ -95,7 +95,7 @@ static const ProcMap s_proc_map[] = {
PROC(glColorMask),
PROC(glColorMaterial),
PROC(glColorPointer),
//PROC(glCopyPixels),
PROC(glCopyPixels),
//PROC(glCopyTexImage1D),
//PROC(glCopyTexImage2D),
//PROC(glCopyTexSubImage1D),
Expand All @@ -105,13 +105,13 @@ static const ProcMap s_proc_map[] = {
PROC(glDeleteTextures),
PROC(glDepthFunc),
PROC(glDepthMask),
//PROC(glDepthRange),
PROC(glDepthRange),
PROC(glDisable),
PROC(glDisableClientState),
PROC(glDrawArrays),
PROC(glDrawBuffer),
PROC(glDrawElements),
//PROC(glDrawPixels),
PROC(glDrawPixels),
//PROC(glEdgeFlag),
//PROC(glEdgeFlagPointer),
//PROC(glEdgeFlagv),
Expand Down Expand Up @@ -155,9 +155,9 @@ static const ProcMap s_proc_map[] = {
//PROC(glGetMapiv),
//PROC(glGetMaterialfv),
//PROC(glGetMaterialiv),
//PROC(glGetPixelMapfv),
//PROC(glGetPixelMapuiv),
//PROC(glGetPixelMapusv),
PROC(glGetPixelMapfv),
PROC(glGetPixelMapuiv),
PROC(glGetPixelMapusv),
//PROC(glGetPointerv),
//PROC(glGetPolygonStipple),
PROC(glGetString),
Expand Down Expand Up @@ -234,10 +234,10 @@ static const ProcMap s_proc_map[] = {
PROC(glNormalPointer),
PROC(glOrtho),
//PROC(glPassThrough),
//PROC(glPixelMapfv),
//PROC(glPixelMapuiv),
//PROC(glPixelMapusv),
//PROC(glPixelStoref),
PROC(glPixelMapfv),
PROC(glPixelMapuiv),
PROC(glPixelMapusv),
PROC(glPixelStoref),
PROC(glPixelStorei),
//PROC(glPixelTransferf),
//PROC(glPixelTransferi),
Expand All @@ -255,30 +255,30 @@ static const ProcMap s_proc_map[] = {
PROC(glPushClientAttrib),
PROC(glPushMatrix),
PROC(glPushName),
//PROC(glRasterPos2d),
//PROC(glRasterPos2dv),
//PROC(glRasterPos2f),
//PROC(glRasterPos2fv),
//PROC(glRasterPos2i),
//PROC(glRasterPos2iv),
//PROC(glRasterPos2s),
//PROC(glRasterPos2sv),
//PROC(glRasterPos3d),
//PROC(glRasterPos3dv),
//PROC(glRasterPos3f),
//PROC(glRasterPos3fv),
//PROC(glRasterPos3i),
//PROC(glRasterPos3iv),
//PROC(glRasterPos3s),
//PROC(glRasterPos3sv),
//PROC(glRasterPos4d),
//PROC(glRasterPos4dv),
//PROC(glRasterPos4f),
//PROC(glRasterPos4fv),
//PROC(glRasterPos4i),
//PROC(glRasterPos4iv),
//PROC(glRasterPos4s),
//PROC(glRasterPos4sv),
PROC(glRasterPos2d),
PROC(glRasterPos2dv),
PROC(glRasterPos2f),
PROC(glRasterPos2fv),
PROC(glRasterPos2i),
PROC(glRasterPos2iv),
PROC(glRasterPos2s),
PROC(glRasterPos2sv),
PROC(glRasterPos3d),
PROC(glRasterPos3dv),
PROC(glRasterPos3f),
PROC(glRasterPos3fv),
PROC(glRasterPos3i),
PROC(glRasterPos3iv),
PROC(glRasterPos3s),
PROC(glRasterPos3sv),
PROC(glRasterPos4d),
PROC(glRasterPos4dv),
PROC(glRasterPos4f),
PROC(glRasterPos4fv),
PROC(glRasterPos4i),
PROC(glRasterPos4iv),
PROC(glRasterPos4s),
PROC(glRasterPos4sv),
PROC(glReadBuffer),
PROC(glReadPixels),
PROC(glRectd),
Expand Down
32 changes: 27 additions & 5 deletions src/gc_gl.c
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,17 @@ void ogx_initialize()
glparamstate.pack_alignment = 4;
glparamstate.unpack_alignment = 4;

glparamstate.raster_pos[0] = 0.0f;
glparamstate.raster_pos[1] = 0.0f;
glparamstate.raster_pos[2] = 0.0f;
glparamstate.raster_pos[3] = 1.0f;
glparamstate.raster_pos_valid = true;

glparamstate.depth_near = 0.0f;
glparamstate.depth_far = 1.0f;

glparamstate.pixel_maps = NULL;

// Set up lights default states
glparamstate.lighting.enabled = 0;
for (i = 0; i < MAX_LIGHTS; i++) {
Expand Down Expand Up @@ -414,12 +425,12 @@ void _ogx_setup_2D_projection()

Mtx44 proj;
/* The 0.5f is to center the drawing into the pixels. */
float left = glparamstate.viewport[0] + 0.5f;
float top = glparamstate.viewport[1] + 0.5f;
float left = glparamstate.viewport[0] - 0.5f;
float top = glparamstate.viewport[1] - 0.5f;
guOrtho(proj,
top, top + (glparamstate.viewport[3] - 1),
left, left + (glparamstate.viewport[2] - 1),
0, 1);
top, top + glparamstate.viewport[3],
left, left + glparamstate.viewport[2],
glparamstate.depth_near, glparamstate.depth_far);
GX_LoadProjectionMtx(proj, GX_ORTHOGRAPHIC);

glparamstate.dirty.bits.dirty_matrices = 1;
Expand Down Expand Up @@ -812,6 +823,11 @@ void glColorMaterial(GLenum face, GLenum mode)
glparamstate.lighting.color_material_mode = mode;
}

void glPixelStoref(GLenum pname, GLfloat param)
{
glPixelStorei(pname, param);
}

void glPixelStorei(GLenum pname, GLint param)
{
switch (pname) {
Expand Down Expand Up @@ -1285,6 +1301,12 @@ void glDepthMask(GLboolean flag)
glparamstate.dirty.bits.dirty_z = 1;
}

void glDepthRange(GLclampd near_val, GLclampd far_val)
{
glparamstate.depth_near = near_val;
glparamstate.depth_far = far_val;
}

GLint glRenderMode(GLenum mode)
{
int hit_count;
Expand Down
35 changes: 35 additions & 0 deletions src/getters.c
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,10 @@ void glGetDoublev(GLenum pname, GLdouble *params)

glGetFloatv(pname, paramsf);
switch (pname) {
case GL_CURRENT_RASTER_POSITION:
n = 4; break;
case GL_DEPTH_RANGE:
n = 2; break;
case GL_MODELVIEW_MATRIX:
case GL_PROJECTION_MATRIX:
n = 16; break;
Expand All @@ -122,6 +126,13 @@ void glGetDoublev(GLenum pname, GLdouble *params)
void glGetFloatv(GLenum pname, GLfloat *params)
{
switch (pname) {
case GL_CURRENT_RASTER_POSITION:
floatcpy(params, glparamstate.raster_pos, 4);
break;
case GL_DEPTH_RANGE:
params[0] = glparamstate.depth_near;
params[1] = glparamstate.depth_far;
break;
case GL_MODELVIEW_MATRIX:
for (int i = 0; i < 3; i++)
for (int j = 0; j < 4; j++)
Expand Down Expand Up @@ -155,6 +166,9 @@ void glGetIntegerv(GLenum pname, GLint *params)
*params =
glparamstate.clip_plane_mask & (1 << (pname - GL_CLIP_PLANE0));
return;
case GL_CURRENT_RASTER_POSITION_VALID:
*params = glparamstate.raster_pos_valid ? GL_TRUE : GL_FALSE;
break;
case GL_DRAW_BUFFER:
case GL_READ_BUFFER:
*params = glparamstate.active_buffer;
Expand All @@ -174,6 +188,9 @@ void glGetIntegerv(GLenum pname, GLint *params)
case GL_MAX_NAME_STACK_DEPTH:
*params = MAX_NAME_STACK_DEPTH;
return;
case GL_MAX_PIXEL_MAP_TABLE:
*params = MAX_PIXEL_MAP_TABLE;
break;
case GL_NAME_STACK_DEPTH:
*params = glparamstate.name_stack_depth;
return;
Expand Down Expand Up @@ -201,6 +218,24 @@ void glGetIntegerv(GLenum pname, GLint *params)
case GL_PACK_ALIGNMENT:
*params = glparamstate.pack_alignment;
break;
case GL_PIXEL_MAP_I_TO_I_SIZE:
case GL_PIXEL_MAP_S_TO_S_SIZE:
case GL_PIXEL_MAP_I_TO_R_SIZE:
case GL_PIXEL_MAP_I_TO_G_SIZE:
case GL_PIXEL_MAP_I_TO_B_SIZE:
case GL_PIXEL_MAP_I_TO_A_SIZE:
case GL_PIXEL_MAP_R_TO_R_SIZE:
case GL_PIXEL_MAP_G_TO_G_SIZE:
case GL_PIXEL_MAP_B_TO_B_SIZE:
case GL_PIXEL_MAP_A_TO_A_SIZE:
if (glparamstate.pixel_maps) {
int index = pname - GL_PIXEL_MAP_I_TO_I_SIZE;
*params = glparamstate.pixel_maps->sizes[index];
} else {
/* By default, there's one entry (0.0) in the table */
*params = 1;
}
break;
case GL_STENCIL_BITS:
*params = _ogx_stencil_flags & OGX_STENCIL_8BIT ? 8 : 4;
break;
Expand Down
Loading