add limited-scope compatability glPolygonMode state for GL_TRIANGLES + GL_LINE/GL_POINT
This commit is contained in:
parent
105e3253e2
commit
fca24d106f
37
GL/draw.c
37
GL/draw.c
@ -546,8 +546,12 @@ static void generate(SubmissionTarget* target, const GLenum mode, const GLsizei
|
||||
generateArraysFastPath_QUADS(target, first, count);
|
||||
return; // Don't need to do any more processing
|
||||
case GL_TRIANGLES:
|
||||
generateArraysFastPath_TRIS(target, first, count);
|
||||
return; // Don't need to do any more processing
|
||||
if(_glGetPolygonMode() == GL_FILL) {
|
||||
generateArraysFastPath_TRIS(target, first, count);
|
||||
return; // Don't need to do any more processing
|
||||
}
|
||||
generateArraysFastPath_ALL(target, first, count);
|
||||
break;
|
||||
default:
|
||||
generateArraysFastPath_ALL(target, first, count);
|
||||
}
|
||||
@ -564,7 +568,23 @@ static void generate(SubmissionTarget* target, const GLenum mode, const GLsizei
|
||||
// Drawing arrays
|
||||
switch(mode) {
|
||||
case GL_TRIANGLES:
|
||||
genTriangles(it, count);
|
||||
GLenum polygon_mode = _glGetPolygonMode();
|
||||
if(polygon_mode == GL_POINT) {
|
||||
genPoints(it, count);
|
||||
} else if(polygon_mode == GL_LINE) {
|
||||
Vertex* src = it + count - 1;
|
||||
Vertex* dst = it + target->count - 1;
|
||||
GLuint remaining_count = count;
|
||||
while(remaining_count) {
|
||||
dst = draw_line(dst, src, src - 2);
|
||||
dst = draw_line(dst, src, src - 1);
|
||||
dst = draw_line(dst, src - 1, src - 2);
|
||||
src -= 3;
|
||||
remaining_count -= 3;
|
||||
}
|
||||
} else {
|
||||
genTriangles(it, count);
|
||||
}
|
||||
break;
|
||||
case GL_QUADS:
|
||||
genQuads(it, count);
|
||||
@ -751,6 +771,14 @@ GL_FORCE_INLINE GLuint calcFinalVertices(GLenum mode, GLuint count) {
|
||||
return LINE_STRIP_COUNT(count);
|
||||
case GL_LINES:
|
||||
return LINES_COUNT(count);
|
||||
case GL_TRIANGLES:
|
||||
GLenum polygon_mode = _glGetPolygonMode();
|
||||
if(polygon_mode == GL_POINT) {
|
||||
return POINTS_COUNT(count);
|
||||
} else if(polygon_mode == GL_LINE) {
|
||||
return LINES_COUNT(count * 2);
|
||||
}
|
||||
return count;
|
||||
case GL_TRIANGLE_FAN:
|
||||
return TRIFAN_COUNT(count);
|
||||
case GL_QUAD_STRIP:
|
||||
@ -769,6 +797,9 @@ GL_FORCE_INLINE void submitVertices(GLenum mode, GLsizei first, GLuint count, GL
|
||||
if(!(ATTRIB_LIST.enabled & VERTEX_ENABLED_FLAG)) return;
|
||||
if(ATTRIB_LIST.dirty) _glUpdateAttributes();
|
||||
|
||||
if(mode == GL_TRIANGLES) {
|
||||
count -= (count % 3);
|
||||
}
|
||||
/* No vertices? Do nothing */
|
||||
if(!count) return;
|
||||
|
||||
|
||||
@ -407,6 +407,7 @@ GLboolean _glIsFogEnabled();
|
||||
GLenum _glGetDepthFunc();
|
||||
GLenum _glGetCullFace();
|
||||
GLenum _glGetFrontFace();
|
||||
GLenum _glGetPolygonMode();
|
||||
GLenum _glGetGpuBlendSrcFactor();
|
||||
GLenum _glGetGpuBlendDstFactor();
|
||||
|
||||
|
||||
28
GL/state.c
28
GL/state.c
@ -42,6 +42,7 @@ static struct {
|
||||
GLboolean blend_enabled;
|
||||
GLfloat offset_factor;
|
||||
GLfloat offset_units;
|
||||
GLenum polygon_mode;
|
||||
|
||||
GLfloat scene_ambient[4];
|
||||
GLboolean viewer_in_eye_coords;
|
||||
@ -77,6 +78,7 @@ static struct {
|
||||
.blend_enabled = GL_FALSE,
|
||||
.offset_factor = 0.0f,
|
||||
.offset_units = 0.0f,
|
||||
.polygon_mode = GL_FILL,
|
||||
.scene_ambient = {0.2f, 0.2f, 0.2f, 1.0f},
|
||||
.viewer_in_eye_coords = GL_TRUE,
|
||||
.color_control = GL_SINGLE_COLOR,
|
||||
@ -155,6 +157,10 @@ GLenum _glGetFrontFace() {
|
||||
return GPUState.front_face;
|
||||
}
|
||||
|
||||
GLenum _glGetPolygonMode() {
|
||||
return GPUState.polygon_mode;
|
||||
}
|
||||
|
||||
GLboolean _glIsFogEnabled() {
|
||||
return GPUState.fog_enabled;
|
||||
}
|
||||
@ -724,8 +730,26 @@ GLAPI void APIENTRY glHint(GLenum target, GLenum mode) {
|
||||
|
||||
/* Polygon Rasterization Mode */
|
||||
GLAPI void APIENTRY glPolygonMode(GLenum face, GLenum mode) {
|
||||
_GL_UNUSED(face);
|
||||
_GL_UNUSED(mode);
|
||||
GLint validModes[] = {
|
||||
GL_FILL,
|
||||
GL_LINE,
|
||||
GL_POINT,
|
||||
0
|
||||
};
|
||||
GLint validFaces[] = {
|
||||
GL_FRONT_AND_BACK,
|
||||
0
|
||||
};
|
||||
|
||||
if(_glCheckValidEnum(mode, validModes, __func__) != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(_glCheckValidEnum(face, validFaces, __func__) != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
GPUState.polygon_mode = mode;
|
||||
}
|
||||
|
||||
/* Culling */
|
||||
|
||||
Loading…
Reference in New Issue
Block a user