Add primitive modes sample, quad strips partially work
Although the second triangle is wrongly culled
This commit is contained in:
parent
19a76cbefd
commit
165eb9d5c8
@ -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)
|
||||
|
||||
18
GL/draw.c
18
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;
|
||||
}
|
||||
|
||||
189
samples/primitive_modes/main.c
Normal file
189
samples/primitive_modes/main.c
Normal 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;
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user