diff --git a/src/api/graphics.c b/src/api/graphics.c index 56382f6d..25f5373e 100644 --- a/src/api/graphics.c +++ b/src/api/graphics.c @@ -528,7 +528,7 @@ int l_lovrGraphicsSphere(lua_State* L) { } index = luax_readtransform(L, index, transform, 1); int segments = luaL_optnumber(L, index, 30); - lovrGraphicsSphere(texture, transform, segments); + lovrGraphicsSphere(texture, transform, segments, NULL); return 0; } diff --git a/src/graphics/graphics.c b/src/graphics/graphics.c index 5a0d3050..13763459 100644 --- a/src/graphics/graphics.c +++ b/src/graphics/graphics.c @@ -715,7 +715,7 @@ void lovrGraphicsCylinder(float x1, float y1, float z1, float x2, float y2, floa #undef PUSH_CYLINDER_TRIANGLE } -void lovrGraphicsSphere(Texture* texture, mat4 transform, int segments) { +void lovrGraphicsSphere(Texture* texture, mat4 transform, int segments, Skybox* skybox) { vec_clear(&state.buffer.data); vec_clear(&state.buffer.indices); @@ -732,9 +732,11 @@ void lovrGraphicsSphere(Texture* texture, mat4 transform, int segments) { vec_push(&state.buffer.data, y); vec_push(&state.buffer.data, z); - vec_push(&state.buffer.data, x); - vec_push(&state.buffer.data, y); - vec_push(&state.buffer.data, z); + if (!skybox) { + vec_push(&state.buffer.data, x); + vec_push(&state.buffer.data, y); + vec_push(&state.buffer.data, z); + } vec_push(&state.buffer.data, u); vec_push(&state.buffer.data, v); @@ -756,21 +758,30 @@ void lovrGraphicsSphere(Texture* texture, mat4 transform, int segments) { } } - lovrGraphicsBindTexture(texture); - lovrGraphicsPush(); - lovrGraphicsMatrixTransform(transform); - lovrGraphicsDrawPrimitive(GL_TRIANGLES, 1, 1, 1); - lovrGraphicsPop(); + if (skybox) { + Texture* oldTexture = lovrGraphicsGetTexture(); + glBindTexture(GL_TEXTURE_2D, skybox->texture); + lovrGraphicsDrawPrimitive(GL_TRIANGLES, 0, 1, 1); + glBindTexture(GL_TEXTURE_2D, oldTexture->id); + } else { + lovrGraphicsBindTexture(texture); + lovrGraphicsPush(); + lovrGraphicsMatrixTransform(transform); + lovrGraphicsDrawPrimitive(GL_TRIANGLES, 1, 1, 1); + lovrGraphicsPop(); + } } void lovrGraphicsSkybox(Skybox* skybox, float angle, float ax, float ay, float az) { lovrGraphicsPush(); lovrGraphicsOrigin(); lovrGraphicsRotate(angle, ax, ay, az); + glDepthMask(GL_FALSE); + int wasCulling = lovrGraphicsIsCullingEnabled(); + lovrGraphicsSetCullingEnabled(0); if (skybox->type == SKYBOX_CUBE) { Shader* lastShader = lovrGraphicsGetShader(); - if (lastShader == state.defaultShader) { lovrRetain(&lastShader->ref); lovrGraphicsSetShader(state.skyboxShader); @@ -819,82 +830,22 @@ void lovrGraphicsSkybox(Skybox* skybox, float angle, float ax, float ay, float a }; lovrGraphicsSetShapeData(cube, 78); - - glDepthMask(GL_FALSE); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_CUBE_MAP, skybox->texture); - - int wasCulling = lovrGraphicsIsCullingEnabled(); - lovrGraphicsSetCullingEnabled(0); lovrGraphicsDrawPrimitive(GL_TRIANGLE_STRIP, 0, 0, 0); - lovrGraphicsSetCullingEnabled(wasCulling); - glBindTexture(GL_TEXTURE_CUBE_MAP, 0); glActiveTexture(GL_TEXTURE0); - glDepthMask(GL_TRUE); if (lastShader == state.defaultShader) { lovrGraphicsSetShader(lastShader); lovrRelease(&lastShader->ref); } } else if (skybox->type == SKYBOX_PANORAMA) { - int resolution = 40; - int idx = 0; - float sphere[8610]; // (resolution + 1) * (resolution + 1) * 5 - - for (int i = 0; i <= resolution; i++) { - float theta = i * M_PI / (float) resolution; - float sinTheta = sin(theta); - float cosTheta = cos(theta); - - for (int j = 0; j <= resolution; j++) { - float phi = j * 2 * M_PI / (float) resolution; - float sinPhi = sin(phi); - float cosPhi = cos(phi); - - float x = sinPhi * sinTheta; - float y = cosTheta; - float z = -cosPhi * sinTheta; - float u = j / (float) resolution; - float v = i / (float) resolution; - - sphere[idx++] = x; - sphere[idx++] = y; - sphere[idx++] = z; - sphere[idx++] = u; - sphere[idx++] = v; - } - } - - idx = 0; - unsigned int indices[9600]; // resolution * resolution * 6 - for (int i = 0; i < resolution; i++) { - unsigned int offset0 = i * (resolution + 1); - unsigned int offset1 = (i + 1) * (resolution + 1); - for (int j = 0; j < resolution; j++) { - unsigned int index0 = offset0 + j; - unsigned int index1 = offset1 + j; - indices[idx++] = index0; - indices[idx++] = index1; - indices[idx++] = index0 + 1; - indices[idx++] = index1; - indices[idx++] = index1 + 1; - indices[idx++] = index0 + 1; - } - } - - Texture* oldTexture = lovrGraphicsGetTexture(); - glBindTexture(GL_TEXTURE_2D, skybox->texture); - - lovrGraphicsSetShapeData(sphere, 8610); - lovrGraphicsSetIndexData(indices, 9600); - glDepthMask(GL_FALSE); - lovrGraphicsDrawPrimitive(GL_TRIANGLES, 0, 1, 1); - glDepthMask(GL_TRUE); - - glBindTexture(GL_TEXTURE_2D, oldTexture->id); + lovrGraphicsSphere(NULL, NULL, 30, skybox); } + lovrGraphicsSetCullingEnabled(wasCulling); + glDepthMask(GL_TRUE); lovrGraphicsPop(); } diff --git a/src/graphics/graphics.h b/src/graphics/graphics.h index 51a6d0df..d49de0be 100644 --- a/src/graphics/graphics.h +++ b/src/graphics/graphics.h @@ -159,7 +159,7 @@ void lovrGraphicsPlane(DrawMode mode, Texture* texture, mat4 transform); void lovrGraphicsPlaneFullscreen(Texture* texture); void lovrGraphicsBox(DrawMode mode, Texture* texture, mat4 transform); void lovrGraphicsCylinder(float x1, float y1, float z1, float x2, float y2, float z2, float r1, float r2, int capped, int segments); -void lovrGraphicsSphere(Texture* texture, mat4 transform, int segments); +void lovrGraphicsSphere(Texture* texture, mat4 transform, int segments, Skybox* skybox); void lovrGraphicsSkybox(Skybox* skybox, float angle, float ax, float ay, float az); void lovrGraphicsPrint(const char* str, mat4 transform, float wrap, HorizontalAlign halign, VerticalAlign valign);