Skip to content
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