diff --git a/src/frontend/BlocksPreview.cpp b/src/frontend/BlocksPreview.cpp index 4791ebbb..a9f325e9 100644 --- a/src/frontend/BlocksPreview.cpp +++ b/src/frontend/BlocksPreview.cpp @@ -4,7 +4,6 @@ #include "../assets/Assets.h" #include "../graphics/Viewport.h" -#include "../graphics/Shader.h" #include "../graphics/Texture.h" #include "../graphics/Atlas.h" #include "../graphics/Batch3D.h" @@ -19,6 +18,7 @@ ImageData* BlocksPreview::draw( const ContentGfxCache* cache, + Shader* shader, Framebuffer* fbo, Batch3D* batch, const Block* def, @@ -30,24 +30,61 @@ ImageData* BlocksPreview::draw( cache->getRegion(id, 2), cache->getRegion(id, 3), cache->getRegion(id, 4), cache->getRegion(id, 5)}; + glm::vec3 offset(0.1f, 0.5f, 0.1f); switch (def->model) { case BlockModel::none: // something went wrong... break; case BlockModel::block: + shader->uniformMatrix("u_apply", glm::translate(glm::mat4(1.0f), offset)); batch->blockCube(glm::vec3(size * 0.63f), texfaces, glm::vec4(1.0f), !def->rt.emissive); + batch->flush(); break; case BlockModel::aabb: { glm::vec3 hitbox = glm::vec3(); for (const auto& box : def->hitboxes) hitbox = glm::max(hitbox, box.size()); + offset.y += (1.0f - hitbox).y * 0.5f; + shader->uniformMatrix("u_apply", glm::translate(glm::mat4(1.0f), offset)); batch->blockCube(hitbox * glm::vec3(size * 0.63f), texfaces, glm::vec4(1.0f), !def->rt.emissive); } + batch->flush(); break; case BlockModel::custom: + { + glm::vec3 hitbox = glm::vec3(); + for (const auto& box : def->modelBoxes) + hitbox = glm::max(hitbox, box.size()); + offset.y += (1.0f - hitbox).y * 0.5f; + shader->uniformMatrix("u_apply", glm::translate(glm::mat4(1.0f), offset)); + for (size_t i = 0; i < def->modelExtraPoints.size() / 4; i++) { + const UVRegion& reg = def->modelUVs[def->modelBoxes.size() * 6 + i]; + batch->point((def->modelExtraPoints[i * 4 + 0] - glm::vec3(0.0f, 0.0f, 1.0f)) * glm::vec3(size * 0.63f), glm::vec2(reg.u1, reg.v1), glm::vec4(1.0)); + batch->point((def->modelExtraPoints[i * 4 + 1] - glm::vec3(0.0f, 0.0f, 1.0f)) * glm::vec3(size * 0.63f), glm::vec2(reg.u2, reg.v1), glm::vec4(1.0)); + batch->point((def->modelExtraPoints[i * 4 + 2] - glm::vec3(0.0f, 0.0f, 1.0f)) * glm::vec3(size * 0.63f), glm::vec2(reg.u2, reg.v2), glm::vec4(1.0)); + batch->point((def->modelExtraPoints[i * 4 + 0] - glm::vec3(0.0f, 0.0f, 1.0f)) * glm::vec3(size * 0.63f), glm::vec2(reg.u1, reg.v1), glm::vec4(1.0)); + batch->point((def->modelExtraPoints[i * 4 + 2] - glm::vec3(0.0f, 0.0f, 1.0f)) * glm::vec3(size * 0.63f), glm::vec2(reg.u2, reg.v2), glm::vec4(1.0)); + batch->point((def->modelExtraPoints[i * 4 + 3] - glm::vec3(0.0f, 0.0f, 1.0f)) * glm::vec3(size * 0.63f), glm::vec2(reg.u1, reg.v2), glm::vec4(1.0)); + batch->flush(); + } + for (size_t i = 0; i < def->modelBoxes.size(); i++) { + const UVRegion (&texfaces)[6] = { + def->modelUVs[i * 6], + def->modelUVs[i * 6 + 1], + def->modelUVs[i * 6 + 2], + def->modelUVs[i * 6 + 3], + def->modelUVs[i * 6 + 4], + def->modelUVs[i * 6 + 5] + }; + shader->uniformMatrix("u_apply", glm::translate(glm::mat4(1.0f), offset)); + batch->cube(def->modelBoxes[i].a, def->modelBoxes[i].size() * glm::vec3(size * 0.63f), texfaces, glm::vec4(1.0f), !def->rt.emissive); + } + batch->flush(); + } + break; case BlockModel::xsprite: { glm::vec3 right = glm::normalize(glm::vec3(1.f, 0.f, -1.f)); batch->sprite(right*float(size)*0.43f+glm::vec3(0, size*0.4f, 0), @@ -56,10 +93,10 @@ ImageData* BlocksPreview::draw( size*0.5f, size*0.6f, texfaces[0], glm::vec4(1.0f)); + batch->flush(); break; } } - batch->flush(); return fbo->texture->readData(); } @@ -101,18 +138,8 @@ std::unique_ptr BlocksPreview::build( fbo.bind(); for (size_t i = 0; i < count; i++) { auto def = indices->getBlockDef(i); - - glm::vec3 offset(0.1f, 0.5f, 0.1f); - if (def->model == BlockModel::aabb) { - glm::vec3 size = glm::vec3(0, 0, 0); - for (const auto& box : def->hitboxes) - size = glm::max(size, box.size()); - offset.y += (1.0f - size).y * 0.5f; - } atlas->getTexture()->bind(); - shader->uniformMatrix("u_apply", glm::translate(glm::mat4(1.0f), offset)); - - builder.add(def->name, draw(cache, &fbo, &batch, def, iconSize)); + builder.add(def->name, draw(cache, shader, &fbo, &batch, def, iconSize)); } fbo.unbind(); diff --git a/src/frontend/BlocksPreview.h b/src/frontend/BlocksPreview.h index 586fce38..f498e79c 100644 --- a/src/frontend/BlocksPreview.h +++ b/src/frontend/BlocksPreview.h @@ -2,6 +2,7 @@ #define FRONTEND_BLOCKS_PREVIEW_H_ #include "../typedefs.h" +#include "../graphics/Shader.h" #include #include @@ -17,6 +18,7 @@ class ContentGfxCache; class BlocksPreview { static ImageData* draw( const ContentGfxCache* cache, + Shader* shader, Framebuffer* framebuffer, Batch3D* batch, const Block* block, diff --git a/src/graphics/Batch3D.cpp b/src/graphics/Batch3D.cpp index 1d62e334..2def65ef 100644 --- a/src/graphics/Batch3D.cpp +++ b/src/graphics/Batch3D.cpp @@ -167,8 +167,7 @@ void Batch3D::xSprite(float w, float h, const UVRegion& uv, const vec4 tint, boo face(vec3(w * 0.25f, 0.0f, w * 0.5f - w *0.25f), w, h, vec3(0, 0, -1), vec3(0, 1, 0), uv, (shading ? do_tint(0.9f)*tint : tint)); } -void Batch3D::blockCube(const vec3 size, const UVRegion(&texfaces)[6], const vec4 tint, bool shading) { - vec3 coord = (1.0f - size) * -0.5f; +void Batch3D::cube(const vec3 coord, const vec3 size, const UVRegion(&texfaces)[6], const vec4 tint, bool shading) { face(coord+vec3(0.0f, 0.0f, 0.0f), size.x, size.y, vec3(1, 0, 0), vec3(0, 1, 0), texfaces[5], (shading ? do_tint(0.8)*tint : tint)); face(coord+vec3(size.x, 0.0f, -size.z), size.x, size.y, vec3(-1, 0, 0), vec3(0, 1, 0), texfaces[4], (shading ? do_tint(0.8f)*tint : tint)); face(coord+vec3(0.0f, size.y, 0.0f), size.x, size.z, vec3(1, 0, 0), vec3(0, 0, -1), texfaces[3], (shading ? do_tint(1.0f)*tint : tint)); @@ -177,8 +176,16 @@ void Batch3D::blockCube(const vec3 size, const UVRegion(&texfaces)[6], const vec face(coord+vec3(size.x, 0.0f, 0.0f), size.z, size.y, vec3(0, 0, -1), vec3(0, 1, 0), texfaces[1], (shading ? do_tint(0.9f)*tint : tint)); } +void Batch3D::blockCube(const vec3 size, const UVRegion(&texfaces)[6], const vec4 tint, bool shading) { + cube((1.0f - size) * -0.5f, size, texfaces, tint, shading); +} + +void Batch3D::point(glm::vec3 coord, glm::vec2 uv, glm::vec4 tint) { + vertex(coord, uv, tint.r, tint.g, tint.b, tint.a); +} + void Batch3D::point(glm::vec3 coord, glm::vec4 tint) { - vertex(coord, glm::vec2(), tint.r, tint.g, tint.b, tint.a); + point(coord, glm::vec2(), tint); } void Batch3D::flush() { diff --git a/src/graphics/Batch3D.h b/src/graphics/Batch3D.h index d9a13882..771a79ea 100644 --- a/src/graphics/Batch3D.h +++ b/src/graphics/Batch3D.h @@ -41,7 +41,9 @@ public: void texture(Texture* texture); void sprite(glm::vec3 pos, glm::vec3 up, glm::vec3 right, float w, float h, const UVRegion& uv, glm::vec4 tint); void xSprite(float w, float h, const UVRegion& uv, const glm::vec4 tint, bool shading=true); + void cube(const glm::vec3 coords, const glm::vec3 size, const UVRegion(&texfaces)[6], const glm::vec4 tint, bool shading=true); void blockCube(const glm::vec3 size, const UVRegion(&texfaces)[6], const glm::vec4 tint, bool shading=true); + void point(glm::vec3 pos, glm::vec2 uv, glm::vec4 tint); void point(glm::vec3 pos, glm::vec4 tint); void flush(); void flushPoints();