diff --git a/assets/shaders/phong.fs b/assets/shaders/phong.fs index 66a2099..8f86988 100644 --- a/assets/shaders/phong.fs +++ b/assets/shaders/phong.fs @@ -53,6 +53,7 @@ uniform int numPointLights; uniform DirLight sunLight; uniform Material material; uniform sampler2DArray studs; +uniform float transparency; // Functions @@ -72,7 +73,7 @@ void main() { } vec4 studPx = texture(studs, vec3(vTexCoords, vSurfaceZ)); - FragColor = vec4(mix(result, vec3(studPx), studPx.w), 1); + FragColor = vec4(mix(result, vec3(studPx), studPx.w), 1-transparency); } vec3 calculateDirectionalLight(DirLight light) { diff --git a/core/src/rendering/renderer.cpp b/core/src/rendering/renderer.cpp index 7a94125..884e784 100644 --- a/core/src/rendering/renderer.cpp +++ b/core/src/rendering/renderer.cpp @@ -70,6 +70,8 @@ void renderParts() { glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glFrontFace(GL_CW); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Use shader shader->use(); @@ -114,12 +116,40 @@ void renderParts() { // Pass in the camera position shader->set("viewPos", camera.cameraPos); - // TODO: Same as todo in src/physics/simulation.cpp + // Sort by nearest + std::map> sorted; for (InstanceRef inst : workspace()->GetChildren()) { if (inst->GetClass()->className != "Part") continue; std::shared_ptr part = std::dynamic_pointer_cast(inst); + if (part->transparency > 0.00001) { + float distance = glm::length(glm::vec3(Data::Vector3(camera.cameraPos) - part->position())); + sorted[distance] = part; + } else { + glm::mat4 model = part->cframe; + if (part->name == "camera") model = camera.getLookAt(); + model = glm::scale(model, part->size); + shader->set("model", model); + shader->set("material", Material { + .diffuse = part->color, + .specular = glm::vec3(0.5f, 0.5f, 0.5f), + .shininess = 16.0f, + }); + glm::mat3 normalMatrix = glm::mat3(glm::transpose(glm::inverse(model))); + shader->set("normalMatrix", normalMatrix); + shader->set("texScale", part->size); + shader->set("transparency", part->transparency); + + CUBE_MESH->bind(); + glDrawArrays(GL_TRIANGLES, 0, CUBE_MESH->vertexCount); + } + } + + // TODO: Same as todo in src/physics/simulation.cpp + // According to LearnOpenGL, std::map automatically sorts its contents. + for (std::map>::reverse_iterator it = sorted.rbegin(); it != sorted.rend(); it++) { + std::shared_ptr part = it->second; glm::mat4 model = part->cframe; - if (inst->name == "camera") model = camera.getLookAt(); + if (part->name == "camera") model = camera.getLookAt(); model = glm::scale(model, part->size); shader->set("model", model); shader->set("material", Material { @@ -130,6 +160,7 @@ void renderParts() { glm::mat3 normalMatrix = glm::mat3(glm::transpose(glm::inverse(model))); shader->set("normalMatrix", normalMatrix); shader->set("texScale", part->size); + shader->set("transparency", part->transparency); CUBE_MESH->bind(); glDrawArrays(GL_TRIANGLES, 0, CUBE_MESH->vertexCount);