From 165eb9d5c852bb0454b80638c0a9129929b43833 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 2 Oct 2024 19:28:02 +1000 Subject: [PATCH] Add primitive modes sample, quad strips partially work Although the second triangle is wrongly culled --- CMakeLists.txt | 1 + GL/draw.c | 18 ++-- samples/primitive_modes/main.c | 189 +++++++++++++++++++++++++++++++++ 3 files changed, 200 insertions(+), 8 deletions(-) create mode 100644 samples/primitive_modes/main.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 048f894..e51c14d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -209,6 +209,7 @@ gen_sample(scissor samples/scissor/main.c) gen_sample(polymark samples/polymark/main.c) gen_sample(cubes samples/cubes/main.cpp) gen_sample(zclip_test tests/zclip/main.cpp) +gen_sample(primitive_modes samples/primitive_modes/main.c) if(PLATFORM_DREAMCAST) gen_sample(trimark samples/trimark/main.c) diff --git a/GL/draw.c b/GL/draw.c index 6071542..a08be59 100644 --- a/GL/draw.c +++ b/GL/draw.c @@ -435,16 +435,20 @@ GL_FORCE_INLINE void genTriangleStrip(Vertex* output, GLuint count) { output[count - 1].flags = GPU_CMD_VERTEX_EOL; } +#define QUADSTRIP_COUNT(count) (((count) - 2) * 2) static void genQuadStrip(Vertex* output, GLuint count) { - Vertex* dst = output + (((count - 2) * 2) - 1); + Vertex* dst = output + QUADSTRIP_COUNT(count) - 1; Vertex* src = output + count;//(count - 1); for (; count > 2; count -= 2) { - *dst = src[-1]; + // Have to copy because of src/dst overlapping on first quad + Vertex src1 = src[-1], src2 = src[-2], src3 = src[-3], src4 = src[-4]; + + *dst = src3; (*dst--).flags = GPU_CMD_VERTEX_EOL; - *dst-- = src[-3]; - *dst-- = src[-2]; - *dst-- = src[-4]; + *dst-- = src4; + *dst-- = src1; + *dst-- = src2; src -= 2; } } @@ -1244,10 +1248,8 @@ GL_FORCE_INLINE GLuint calcFinalVertices(GLenum mode, GLuint count) { return LINES_COUNT(count); case GL_TRIANGLE_FAN: return TRIFAN_COUNT(count); - case GL_QUAD_STRIP: - //return ((count - 2) / 2) * 4; - return (count - 2) * 2; + return QUADSTRIP_COUNT(count); } return count; } diff --git a/samples/primitive_modes/main.c b/samples/primitive_modes/main.c new file mode 100644 index 0000000..db793cc --- /dev/null +++ b/samples/primitive_modes/main.c @@ -0,0 +1,189 @@ +#include +#include +#include + +#ifdef SDL2_BUILD +#include +static SDL_Window* win_handle; +#else +#include +#endif + +static void DrawLineLoop(float y) { + glBegin(GL_LINE_LOOP); + glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(410.0f, y + 10.0f); + glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(490.0f, y + 10.0f); + glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(490.0f, y + 90.0f); + glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(410.0f, y + 90.0f); + glEnd(); +} + +static void DrawLineStrip(float y) { + glBegin(GL_LINE_STRIP); + glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(310.0f, y + 10.0f); + glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(390.0f, y + 10.0f); + glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(390.0f, y + 90.0f); + glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(310.0f, y + 90.0f); + glEnd(); +} + +static void DrawLine(float y) { + glBegin(GL_LINES); + glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(210.0f, y + 10.0f); + glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(290.0f, y + 10.0f); + glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(290.0f, y + 90.0f); + glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(210.0f, y + 90.0f); + + glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(230.0f, y + 25.0f); + glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(250.0f, y + 75.0f); + glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(260.0f, y + 75.0f); + glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(280.0f, y + 45.0f); + glEnd(); +} + +static void DrawPoint(float y) { + glBegin(GL_POINTS); + glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(110.0f, y + 10.0f); + glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(190.0f, y + 10.0f); + glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(190.0f, y + 90.0f); + glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(110.0f, y + 90.0f); + glEnd(); +} + +static void DrawQuad(float y) { + glBegin(GL_QUADS); + glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(10.0f, y + 10.0f); + glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(90.0f, y + 10.0f); + glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(90.0f, y + 90.0f); + glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(10.0f, y + 90.0f); + + glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(110.0f, y + 10.0f); + glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(190.0f, y + 10.0f); + glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(190.0f, y + 90.0f); + glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(110.0f, y + 90.0f); + glEnd(); +} + +static void DrawQuadStrip(float y) { + glBegin(GL_QUAD_STRIP); + glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(210.0f, y + 10.0f); + glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(290.0f, y + 10.0f); + glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(290.0f, y + 90.0f); + glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(210.0f, y + 90.0f); + + glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(310.0f, y + 10.0f); + glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(390.0f, y + 10.0f); + glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(390.0f, y + 90.0f); + glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(310.0f, y + 90.0f); + glEnd(); +} + +static void DrawTriList(float y) { + glBegin(GL_TRIANGLES); + glColor3f(1.0f, 0.0f, 0.0f); glVertex2f( 10.0f, y + 10.0f); + glColor3f(0.0f, 1.0f, 0.0f); glVertex2f( 90.0f, y + 10.0f); + glColor3f(0.0f, 0.0f, 1.0f); glVertex2f( 90.0f, y + 90.0f); + + glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(110.0f, y + 10.0f); + glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(190.0f, y + 10.0f); + glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(190.0f, y + 90.0f); + glEnd(); +} + +static void DrawTriStrip(float y) { + glBegin(GL_TRIANGLE_STRIP); + glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(210.0f, y + 10.0f); + glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(290.0f, y + 10.0f); + glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(290.0f, y + 90.0f); + glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(210.0f, y + 90.0f); + + glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(310.0f, y + 10.0f); + glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(390.0f, y + 10.0f); + glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(390.0f, y + 90.0f); + glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(310.0f, y + 90.0f); + glEnd(); +} + + +static void DrawTriFan(float y) { + glBegin(GL_TRIANGLE_FAN); + glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(410.0f, y + 10.0f); + glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(490.0f, y + 10.0f); + glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(445.0f, y + 90.0f); + + glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(590.0f, y + 10.0f); + glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(510.0f, y + 45.0f); + glEnd(); +} + +int main(int argc, char *argv[]) { +#ifdef SDL2_BUILD + SDL_Init(SDL_INIT_EVERYTHING); + win_handle = SDL_CreateWindow("Shapes", 0, 0, 640, 480, SDL_WINDOW_OPENGL); + SDL_GL_CreateContext(win_handle); +#else + glKosInit(); +#endif + + glClearColor(0.5f, 0.5f, 0.5f, 1); + glViewport(0, 0, 640, 480); + + float mat[4][4] = { 0 }; + float L = 0, T = 0, R = 640, B = 480, N = -100, F = 100; + mat[0][0] = 2.0f / (R - L); + mat[1][1] = 2.0f / (T - B); + mat[2][2] = -2.0f / (F - N); + mat[3][0] = -(R + L) / (R - L); + mat[3][1] = -(T + B) / (T - B); + mat[3][2] = -(F + N) / (F - N); + mat[3][3] = 1; + glLoadMatrixf(mat); + + int running = 1; + + while (running) { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + +#ifdef SDL2_BUILD + SDL_Event event; + while (SDL_PollEvent(&event)) { + if(event.type == SDL_QUIT) running = 0; + } +#endif + + DrawTriStrip(300); + DrawTriFan(300); + DrawTriList(300); + + DrawQuadStrip(200); + DrawQuad(200); + + glPointSize(5); + DrawPoint(100); + glLineWidth(0.5f); + DrawLineLoop(100); + glLineWidth(2); + DrawLineStrip(100); + glLineWidth(10); + DrawLine(100); + + glPointSize(1); + glLineWidth(1); + DrawPoint(0); + DrawLineLoop(0); + DrawLineStrip(0); + DrawLine(0); + + glShadeModel(GL_FLAT); + DrawQuad(400); + DrawTriStrip(400); + glShadeModel(GL_SMOOTH); + +#ifdef SDL2_BUILD + SDL_GL_SwapWindow(win_handle); +#else + glKosSwapBuffers(); +#endif + } + return 0; +}