Merge pull request #163 from InfiniteCoder01/main
Custom model block preview
This commit is contained in:
@@ -4,7 +4,6 @@
|
|||||||
|
|
||||||
#include "../assets/Assets.h"
|
#include "../assets/Assets.h"
|
||||||
#include "../graphics/Viewport.h"
|
#include "../graphics/Viewport.h"
|
||||||
#include "../graphics/Shader.h"
|
|
||||||
#include "../graphics/Texture.h"
|
#include "../graphics/Texture.h"
|
||||||
#include "../graphics/Atlas.h"
|
#include "../graphics/Atlas.h"
|
||||||
#include "../graphics/Batch3D.h"
|
#include "../graphics/Batch3D.h"
|
||||||
@@ -19,6 +18,7 @@
|
|||||||
|
|
||||||
ImageData* BlocksPreview::draw(
|
ImageData* BlocksPreview::draw(
|
||||||
const ContentGfxCache* cache,
|
const ContentGfxCache* cache,
|
||||||
|
Shader* shader,
|
||||||
Framebuffer* fbo,
|
Framebuffer* fbo,
|
||||||
Batch3D* batch,
|
Batch3D* batch,
|
||||||
const Block* def,
|
const Block* def,
|
||||||
@@ -30,24 +30,61 @@ ImageData* BlocksPreview::draw(
|
|||||||
cache->getRegion(id, 2), cache->getRegion(id, 3),
|
cache->getRegion(id, 2), cache->getRegion(id, 3),
|
||||||
cache->getRegion(id, 4), cache->getRegion(id, 5)};
|
cache->getRegion(id, 4), cache->getRegion(id, 5)};
|
||||||
|
|
||||||
|
glm::vec3 offset(0.1f, 0.5f, 0.1f);
|
||||||
switch (def->model) {
|
switch (def->model) {
|
||||||
case BlockModel::none:
|
case BlockModel::none:
|
||||||
// something went wrong...
|
// something went wrong...
|
||||||
break;
|
break;
|
||||||
case BlockModel::block:
|
case BlockModel::block:
|
||||||
|
shader->uniformMatrix("u_apply", glm::translate(glm::mat4(1.0f), offset));
|
||||||
batch->blockCube(glm::vec3(size * 0.63f), texfaces,
|
batch->blockCube(glm::vec3(size * 0.63f), texfaces,
|
||||||
glm::vec4(1.0f), !def->rt.emissive);
|
glm::vec4(1.0f), !def->rt.emissive);
|
||||||
|
batch->flush();
|
||||||
break;
|
break;
|
||||||
case BlockModel::aabb:
|
case BlockModel::aabb:
|
||||||
{
|
{
|
||||||
glm::vec3 hitbox = glm::vec3();
|
glm::vec3 hitbox = glm::vec3();
|
||||||
for (const auto& box : def->hitboxes)
|
for (const auto& box : def->hitboxes)
|
||||||
hitbox = glm::max(hitbox, box.size());
|
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),
|
batch->blockCube(hitbox * glm::vec3(size * 0.63f),
|
||||||
texfaces, glm::vec4(1.0f), !def->rt.emissive);
|
texfaces, glm::vec4(1.0f), !def->rt.emissive);
|
||||||
}
|
}
|
||||||
|
batch->flush();
|
||||||
break;
|
break;
|
||||||
case BlockModel::custom:
|
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: {
|
case BlockModel::xsprite: {
|
||||||
glm::vec3 right = glm::normalize(glm::vec3(1.f, 0.f, -1.f));
|
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),
|
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,
|
size*0.5f, size*0.6f,
|
||||||
texfaces[0],
|
texfaces[0],
|
||||||
glm::vec4(1.0f));
|
glm::vec4(1.0f));
|
||||||
|
batch->flush();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
batch->flush();
|
|
||||||
return fbo->texture->readData();
|
return fbo->texture->readData();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,18 +138,8 @@ std::unique_ptr<Atlas> BlocksPreview::build(
|
|||||||
fbo.bind();
|
fbo.bind();
|
||||||
for (size_t i = 0; i < count; i++) {
|
for (size_t i = 0; i < count; i++) {
|
||||||
auto def = indices->getBlockDef(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();
|
atlas->getTexture()->bind();
|
||||||
shader->uniformMatrix("u_apply", glm::translate(glm::mat4(1.0f), offset));
|
builder.add(def->name, draw(cache, shader, &fbo, &batch, def, iconSize));
|
||||||
|
|
||||||
builder.add(def->name, draw(cache, &fbo, &batch, def, iconSize));
|
|
||||||
}
|
}
|
||||||
fbo.unbind();
|
fbo.unbind();
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#define FRONTEND_BLOCKS_PREVIEW_H_
|
#define FRONTEND_BLOCKS_PREVIEW_H_
|
||||||
|
|
||||||
#include "../typedefs.h"
|
#include "../typedefs.h"
|
||||||
|
#include "../graphics/Shader.h"
|
||||||
#include <glm/glm.hpp>
|
#include <glm/glm.hpp>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
@@ -17,6 +18,7 @@ class ContentGfxCache;
|
|||||||
class BlocksPreview {
|
class BlocksPreview {
|
||||||
static ImageData* draw(
|
static ImageData* draw(
|
||||||
const ContentGfxCache* cache,
|
const ContentGfxCache* cache,
|
||||||
|
Shader* shader,
|
||||||
Framebuffer* framebuffer,
|
Framebuffer* framebuffer,
|
||||||
Batch3D* batch,
|
Batch3D* batch,
|
||||||
const Block* block,
|
const Block* block,
|
||||||
|
|||||||
@@ -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));
|
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) {
|
void Batch3D::cube(const vec3 coord, const vec3 size, const UVRegion(&texfaces)[6], const vec4 tint, bool shading) {
|
||||||
vec3 coord = (1.0f - size) * -0.5f;
|
|
||||||
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(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(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));
|
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));
|
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) {
|
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() {
|
void Batch3D::flush() {
|
||||||
|
|||||||
@@ -41,7 +41,9 @@ public:
|
|||||||
void texture(Texture* texture);
|
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 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 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 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 point(glm::vec3 pos, glm::vec4 tint);
|
||||||
void flush();
|
void flush();
|
||||||
void flushPoints();
|
void flushPoints();
|
||||||
|
|||||||
Reference in New Issue
Block a user