142 lines
4.6 KiB
C++
Executable File
142 lines
4.6 KiB
C++
Executable File
#include "Deer/Enviroment.h"
|
|
|
|
#include "Deer/Application.h"
|
|
|
|
#include "Deer/Components.h"
|
|
#include "Deer/Voxel.h"
|
|
|
|
#include "DeerRender/Shader.h"
|
|
#include "DeerRender/Mesh.h"
|
|
#include "DeerRender/Render/Render.h"
|
|
#include "DeerRender/Render/RenderUtils.h"
|
|
#include "DeerRender/Render/Texture.h"
|
|
|
|
#include "Deer/Log.h"
|
|
|
|
namespace Deer {
|
|
void Environment::render(SceneCamera& camera) {
|
|
glm::mat4 camMatrix = glm::inverse(camera.transform.getMatrix());
|
|
glm::mat4 projectionMatrix = camera.camera.getMatrix();
|
|
glm::mat4 invertZ = glm::scale(glm::mat4(1.0f), glm::vec3(1, 1, -1));
|
|
|
|
// Lets invert the z axis for engine convenience
|
|
glm::mat4 cameraProjectionMatrix = projectionMatrix * invertZ * camMatrix;
|
|
{
|
|
auto view = m_registry.view<MeshComponent, ShaderComponent, TagComponent>();
|
|
for (auto entityId : view) {
|
|
auto& meshComponent = view.get<MeshComponent>(entityId);
|
|
auto& shaderComponent = view.get<ShaderComponent>(entityId);
|
|
auto& tagComponent = view.get<TagComponent>(entityId);
|
|
|
|
Entity& entity = getEntity(tagComponent.entityUID);
|
|
glm::mat4 matrix = entity.getWorldMatrix();
|
|
|
|
Shader& shader = ShaderManager::getShader(shaderComponent.shaderId);
|
|
|
|
shader.bind();
|
|
shader.uploadUniformMat4("u_viewMatrix", cameraProjectionMatrix);
|
|
shader.uploadUniformMat4("u_worldMatrix", matrix);
|
|
shader.uploadUniformInt("u_objectID", entity.getId());
|
|
|
|
VertexArray& vertexArray = MeshManager::getModel(meshComponent.meshId);
|
|
vertexArray.bind();
|
|
|
|
Render::submit(vertexArray);
|
|
}
|
|
}
|
|
|
|
// Draw Grid Gizmo
|
|
{
|
|
RenderUtils::m_lineShader->bind();
|
|
RenderUtils::m_lineShader->uploadUniformMat4("u_viewMatrix", cameraProjectionMatrix);
|
|
RenderUtils::m_lineShader->uploadUniformFloat3("u_color", glm::vec3(.5f, .5f, .5f));
|
|
for (int x = 0; x < CHUNK_SIZE_X + 1; x++) {
|
|
RenderUtils::m_lineShader->uploadUniformFloat3("u_posA", glm::vec3(x, 0, 0));
|
|
RenderUtils::m_lineShader->uploadUniformFloat3("u_posB", glm::vec3(x, 0, CHUNK_SIZE_Z));
|
|
|
|
Render::submitLine(*RenderUtils::m_lineVertexArray.get());
|
|
}
|
|
for (int z = 0; z < CHUNK_SIZE_Z + 1; z++) {
|
|
RenderUtils::m_lineShader->uploadUniformFloat3("u_posA", glm::vec3(0, 0, z));
|
|
RenderUtils::m_lineShader->uploadUniformFloat3("u_posB", glm::vec3(CHUNK_SIZE_X, 0, z));
|
|
|
|
Render::submitLine(*RenderUtils::m_lineVertexArray.get());
|
|
}
|
|
}
|
|
|
|
// Rendering Camera Gizmo
|
|
{
|
|
RenderUtils::m_lineShader->bind();
|
|
RenderUtils::m_lineShader->uploadUniformMat4("u_viewMatrix", cameraProjectionMatrix);
|
|
RenderUtils::m_lineShader->uploadUniformFloat3("u_color", glm::vec3(.7f, .85f, 1));
|
|
|
|
auto view = m_registry.view<CameraComponent, TagComponent>();
|
|
for (auto entityId : view) {
|
|
CameraComponent cameraComponent = view.get<CameraComponent>(entityId);
|
|
cameraComponent.nearZ = .5f;
|
|
cameraComponent.farZ = 2;
|
|
TagComponent& tag = view.get<TagComponent>(entityId);
|
|
|
|
Entity& entity = getEntity(tag.entityUID);
|
|
|
|
glm::mat4 matrix = entity.getWorldMatrix();
|
|
glm::mat4 camPrespective = glm::inverse(cameraComponent.getMatrix());
|
|
|
|
glm::mat4 cameraMatrix = camPrespective;
|
|
glm::vec3 cameraAxisPoints[2 * 2 * 2];
|
|
|
|
// Generate 8 Points
|
|
for (int x = 0; x < 2; x++) {
|
|
for (int y = 0; y < 2; y++) {
|
|
for (int z = 0; z < 2; z++) {
|
|
glm::vec4 endPos = invertZ * camPrespective * glm::vec4(x * 2 - 1, y * 2 - 1, z, 1);
|
|
endPos = endPos * endPos.w;
|
|
endPos.w = 1;
|
|
|
|
cameraAxisPoints[z * 4 + y * 2 + x] = matrix * endPos;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Draw the lines
|
|
for (int x = 0; x < 2; x++) {
|
|
for (int y = 0; y < 2; y++) {
|
|
int posA = 0 * 4 + y * 2 + x;
|
|
int posB = 1 * 4 + y * 2 + x;
|
|
|
|
RenderUtils::m_lineShader->uploadUniformFloat3("u_posA", cameraAxisPoints[posA]);
|
|
RenderUtils::m_lineShader->uploadUniformFloat3("u_posB", cameraAxisPoints[posB]);
|
|
|
|
Render::submitLine(*RenderUtils::m_lineVertexArray);
|
|
}
|
|
}
|
|
|
|
for (int x = 0; x < 2; x++) {
|
|
for (int z = 0; z < 2; z++) {
|
|
int posA = z * 4 + 0 * 2 + x;
|
|
int posB = z * 4 + 1 * 2 + x;
|
|
|
|
RenderUtils::m_lineShader->uploadUniformFloat3("u_posA", cameraAxisPoints[posA]);
|
|
RenderUtils::m_lineShader->uploadUniformFloat3("u_posB", cameraAxisPoints[posB]);
|
|
|
|
Render::submitLine(*RenderUtils::m_lineVertexArray);
|
|
}
|
|
}
|
|
|
|
for (int y = 0; y < 2; y++) {
|
|
for (int z = 0; z < 2; z++) {
|
|
int posA = z * 4 + y * 2 + 0;
|
|
int posB = z * 4 + y * 2 + 1;
|
|
|
|
RenderUtils::m_lineShader->uploadUniformFloat3("u_posA", cameraAxisPoints[posA]);
|
|
RenderUtils::m_lineShader->uploadUniformFloat3("u_posB", cameraAxisPoints[posB]);
|
|
|
|
Render::submitLine(*RenderUtils::m_lineVertexArray);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
} |