Panorama Skybox fixes;

This commit is contained in:
bjorn 2017-03-12 16:57:27 -07:00
parent 4feeb4d4ab
commit a4257378f0
4 changed files with 31 additions and 17 deletions

View File

@ -147,8 +147,9 @@ void lovrFontPrint(Font* font, const char* str, float x, float y, float z, float
lovrGraphicsRotate(angle, ax, ay, az); lovrGraphicsRotate(angle, ax, ay, az);
lovrGraphicsTranslate(0, -cy / 2, 0); lovrGraphicsTranslate(0, -cy / 2, 0);
lovrGraphicsSetDepthTest(COMPARE_LEQUAL); lovrGraphicsSetDepthTest(COMPARE_LEQUAL);
lovrGraphicsBindTexture(NULL);
lovrGraphicsSetShapeData(font->vertices.data, font->vertices.length); lovrGraphicsSetShapeData(font->vertices.data, font->vertices.length);
lovrGraphicsDrawPrimitive(GL_TRIANGLES, font->texture, 0, 1, 0); lovrGraphicsDrawPrimitive(GL_TRIANGLES, 0, 1, 0);
lovrGraphicsSetDepthTest(oldCompareMode); lovrGraphicsSetDepthTest(oldCompareMode);
lovrGraphicsPop(); lovrGraphicsPop();
} }

View File

@ -453,12 +453,11 @@ void lovrGraphicsSetIndexData(unsigned int* data, int length) {
vec_pusharr(&state.shapeIndices, data, length); vec_pusharr(&state.shapeIndices, data, length);
} }
void lovrGraphicsDrawPrimitive(GLenum mode, Texture* texture, int hasNormals, int hasTexCoords, int useIndices) { void lovrGraphicsDrawPrimitive(GLenum mode, int hasNormals, int hasTexCoords, int useIndices) {
int stride = 3 + (hasNormals ? 3 : 0) + (hasTexCoords ? 2 : 0); int stride = 3 + (hasNormals ? 3 : 0) + (hasTexCoords ? 2 : 0);
int strideBytes = stride * sizeof(float); int strideBytes = stride * sizeof(float);
lovrGraphicsPrepare(); lovrGraphicsPrepare();
lovrGraphicsBindTexture(texture);
glBindVertexArray(state.shapeArray); glBindVertexArray(state.shapeArray);
glBindBuffer(GL_ARRAY_BUFFER, state.shapeBuffer); glBindBuffer(GL_ARRAY_BUFFER, state.shapeBuffer);
glBufferData(GL_ARRAY_BUFFER, state.shapeData.length * sizeof(float), state.shapeData.data, GL_STREAM_DRAW); glBufferData(GL_ARRAY_BUFFER, state.shapeData.length * sizeof(float), state.shapeData.data, GL_STREAM_DRAW);
@ -492,19 +491,23 @@ void lovrGraphicsDrawPrimitive(GLenum mode, Texture* texture, int hasNormals, in
} }
void lovrGraphicsPoints(float* points, int count) { void lovrGraphicsPoints(float* points, int count) {
lovrGraphicsBindTexture(NULL);
lovrGraphicsSetShapeData(points, count); lovrGraphicsSetShapeData(points, count);
lovrGraphicsDrawPrimitive(GL_POINTS, NULL, 0, 0, 0); lovrGraphicsDrawPrimitive(GL_POINTS, 0, 0, 0);
} }
void lovrGraphicsLine(float* points, int count) { void lovrGraphicsLine(float* points, int count) {
lovrGraphicsBindTexture(NULL);
lovrGraphicsSetShapeData(points, count); lovrGraphicsSetShapeData(points, count);
lovrGraphicsDrawPrimitive(GL_LINE_STRIP, NULL, 0, 0, 0); lovrGraphicsDrawPrimitive(GL_LINE_STRIP, 0, 0, 0);
} }
void lovrGraphicsTriangle(DrawMode mode, float* points) { void lovrGraphicsTriangle(DrawMode mode, float* points) {
lovrGraphicsBindTexture(NULL);
if (mode == DRAW_MODE_LINE) { if (mode == DRAW_MODE_LINE) {
lovrGraphicsSetShapeData(points, 9); lovrGraphicsSetShapeData(points, 9);
lovrGraphicsDrawPrimitive(GL_LINE_LOOP, NULL, 0, 0, 0); lovrGraphicsDrawPrimitive(GL_LINE_LOOP, 0, 0, 0);
} else { } else {
float normal[3]; float normal[3];
vec3_cross(vec3_init(normal, &points[0]), &points[3]); vec3_cross(vec3_init(normal, &points[0]), &points[3]);
@ -516,7 +519,7 @@ void lovrGraphicsTriangle(DrawMode mode, float* points) {
}; };
lovrGraphicsSetShapeData(data, 18); lovrGraphicsSetShapeData(data, 18);
lovrGraphicsDrawPrimitive(GL_TRIANGLE_STRIP, NULL, 1, 0, 0); lovrGraphicsDrawPrimitive(GL_TRIANGLE_STRIP, 1, 0, 0);
} }
} }
@ -553,8 +556,9 @@ void lovrGraphicsPlane(DrawMode mode, Texture* texture, float x, float y, float
-.5, -.5, 0 -.5, -.5, 0
}; };
lovrGraphicsBindTexture(NULL);
lovrGraphicsSetShapeData(points, 12); lovrGraphicsSetShapeData(points, 12);
lovrGraphicsDrawPrimitive(GL_LINE_LOOP, NULL, 0, 0, 0); lovrGraphicsDrawPrimitive(GL_LINE_LOOP, 0, 0, 0);
} else if (mode == DRAW_MODE_FILL) { } else if (mode == DRAW_MODE_FILL) {
float data[] = { float data[] = {
-.5, .5, 0, 0, 0, -1, 0, 0, -.5, .5, 0, 0, 0, -1, 0, 0,
@ -563,8 +567,9 @@ void lovrGraphicsPlane(DrawMode mode, Texture* texture, float x, float y, float
.5, -.5, 0, 0, 0, -1, 1, 1 .5, -.5, 0, 0, 0, -1, 1, 1
}; };
lovrGraphicsBindTexture(texture);
lovrGraphicsSetShapeData(data, 32); lovrGraphicsSetShapeData(data, 32);
lovrGraphicsDrawPrimitive(GL_TRIANGLE_STRIP, texture, 1, 1, 0); lovrGraphicsDrawPrimitive(GL_TRIANGLE_STRIP, 1, 1, 0);
} }
lovrGraphicsPop(); lovrGraphicsPop();
@ -582,8 +587,9 @@ void lovrGraphicsPlaneFullscreen(Texture* texture) {
lovrRetain(&lastShader->ref); lovrRetain(&lastShader->ref);
lovrGraphicsSetShader(state.fullscreenShader); lovrGraphicsSetShader(state.fullscreenShader);
lovrGraphicsBindTexture(texture);
lovrGraphicsSetShapeData(data, 20); lovrGraphicsSetShapeData(data, 20);
lovrGraphicsDrawPrimitive(GL_TRIANGLE_STRIP, texture, 0, 1, 0); lovrGraphicsDrawPrimitive(GL_TRIANGLE_STRIP, 0, 1, 0);
lovrGraphicsSetShader(lastShader); lovrGraphicsSetShader(lastShader);
lovrRelease(&lastShader->ref); lovrRelease(&lastShader->ref);
@ -614,9 +620,10 @@ void lovrGraphicsCube(DrawMode mode, Texture* texture, mat4 transform) {
0, 4, 1, 5, 2, 6, 3, 7 // Connections 0, 4, 1, 5, 2, 6, 3, 7 // Connections
}; };
lovrGraphicsBindTexture(NULL);
lovrGraphicsSetShapeData(points, 24); lovrGraphicsSetShapeData(points, 24);
lovrGraphicsSetIndexData(indices, 24); lovrGraphicsSetIndexData(indices, 24);
lovrGraphicsDrawPrimitive(GL_LINES, NULL, 0, 0, 1); lovrGraphicsDrawPrimitive(GL_LINES, 0, 0, 1);
} else { } else {
float data[] = { float data[] = {
// Front // Front
@ -660,8 +667,9 @@ void lovrGraphicsCube(DrawMode mode, Texture* texture, mat4 transform) {
.5, .5, .5, 0, 1, 0, 1, 0 .5, .5, .5, 0, 1, 0, 1, 0
}; };
lovrGraphicsBindTexture(texture);
lovrGraphicsSetShapeData(data, 208); lovrGraphicsSetShapeData(data, 208);
lovrGraphicsDrawPrimitive(GL_TRIANGLE_STRIP, texture, 1, 1, 0); lovrGraphicsDrawPrimitive(GL_TRIANGLE_STRIP, 1, 1, 0);
} }
lovrGraphicsPop(); lovrGraphicsPop();
@ -728,7 +736,7 @@ void lovrGraphicsSkybox(Skybox* skybox, float angle, float ax, float ay, float a
int wasCulling = lovrGraphicsIsCullingEnabled(); int wasCulling = lovrGraphicsIsCullingEnabled();
lovrGraphicsSetCullingEnabled(0); lovrGraphicsSetCullingEnabled(0);
lovrGraphicsDrawPrimitive(GL_TRIANGLE_STRIP, NULL, 0, 0, 0); lovrGraphicsDrawPrimitive(GL_TRIANGLE_STRIP, 0, 0, 0);
lovrGraphicsSetCullingEnabled(wasCulling); lovrGraphicsSetCullingEnabled(wasCulling);
glBindTexture(GL_TEXTURE_CUBE_MAP, 0); glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
@ -762,7 +770,7 @@ void lovrGraphicsSkybox(Skybox* skybox, float angle, float ax, float ay, float a
} }
} }
int indices[9600]; // resolution * resolution * 6 unsigned int indices[9600]; // resolution * resolution * 6
for (int i = 0; i < resolution; i++) { for (int i = 0; i < resolution; i++) {
int offset0 = i * (resolution + 1); int offset0 = i * (resolution + 1);
int offset1 = (i + 1) * (resolution + 1); int offset1 = (i + 1) * (resolution + 1);
@ -778,11 +786,16 @@ void lovrGraphicsSkybox(Skybox* skybox, float angle, float ax, float ay, float a
} }
} }
Texture* oldTexture = lovrGraphicsGetTexture();
glBindTexture(GL_TEXTURE_2D, skybox->texture);
lovrGraphicsSetShapeData(sphere, 8000); lovrGraphicsSetShapeData(sphere, 8000);
lovrGraphicsSetIndexData(indices, 9600); lovrGraphicsSetIndexData(indices, 9600);
glDepthMask(GL_FALSE); glDepthMask(GL_FALSE);
lovrGraphicsDrawPrimitive(GL_TRIANGLES, skybox->texture, 0, 1, 1); lovrGraphicsDrawPrimitive(GL_TRIANGLES, 0, 1, 1);
glDepthMask(GL_TRUE); glDepthMask(GL_TRUE);
glBindTexture(GL_TEXTURE_2D, oldTexture->id);
} }
lovrGraphicsSetShader(lastShader); lovrGraphicsSetShader(lastShader);

View File

@ -154,7 +154,7 @@ void lovrGraphicsMatrixTransform(mat4 transform);
// Primitives // Primitives
void lovrGraphicsSetShapeData(float* data, int length); void lovrGraphicsSetShapeData(float* data, int length);
void lovrGraphicsSetIndexData(unsigned int* data, int length); void lovrGraphicsSetIndexData(unsigned int* data, int length);
void lovrGraphicsDrawPrimitive(GLenum mode, Texture* texture, int hasNormals, int hasTexCoords, int useIndices); void lovrGraphicsDrawPrimitive(GLenum mode, int hasNormals, int hasTexCoords, int useIndices);
void lovrGraphicsPoints(float* points, int count); void lovrGraphicsPoints(float* points, int count);
void lovrGraphicsLine(float* points, int count); void lovrGraphicsLine(float* points, int count);
void lovrGraphicsTriangle(DrawMode mode, float* points); void lovrGraphicsTriangle(DrawMode mode, float* points);

View File

@ -14,5 +14,5 @@ typedef struct {
GLuint texture; GLuint texture;
} Skybox; } Skybox;
Skybox* lovrSkyboxCreate(void** data, size_t* size, int count); Skybox* lovrSkyboxCreate(void** data, size_t* size, SkyboxType type);
void lovrSkyboxDestroy(const Ref* ref); void lovrSkyboxDestroy(const Ref* ref);