Add primitive modes sample, quad strips partially work

Although the second triangle is wrongly culled
This commit is contained in:
UnknownShadow200 2024-10-02 19:28:02 +10:00
parent 19a76cbefd
commit 165eb9d5c8
3 changed files with 200 additions and 8 deletions

View File

@ -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)

View File

@ -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;
}

View File

@ -0,0 +1,189 @@
#include <GL/gl.h>
#include <math.h>
#include <stdlib.h>
#ifdef SDL2_BUILD
#include <SDL2/SDL.h>
static SDL_Window* win_handle;
#else
#include <GL/glkos.h>
#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;
}