File Mesh.cpp
Go to the documentation of this file
#include "Mesh.h"
#include "Camera.h"
#include "macros.h"
#include "xdz_math.h"
Mesh::Mesh(const std::string& path)
{
o_type = GO_MESH;
o_mesh = MeshLib::LoadMesh(path);
SetPos(o_mesh->GetMeshCenter());
MeshLib::ToGeoCenter(o_mesh);
o_name = o_mesh->GetMeshName();
o_material = std::make_shared<Material>();
}
Mesh::Mesh()
{
DEBUG("mesh c");
}
void BindMatertial(const Material* mat, RenderShader* shader)
{
for (const auto& [ptype, pdata] : mat->mat_params) {
const auto& [dtype, dfloat, dcol, _] = pdata;
switch (dtype)
{
case Material::MPARA_FLT:
shader->SetValue("U_" + Material::mat_uniform_name[ptype], dfloat);
break;
case Material::MPARA_COL:
shader->SetValue("U_" + Material::mat_uniform_name[ptype], dcol);
break;
case Material::MPARA_TEX:
shader->SetValue("U_" + Material::mat_uniform_name[ptype], ptype);
break;
}
}
}
void Mesh::RenderMesh(const Context& ctx)
{
const Camera* cam = dynamic_cast<const Camera*>(ctx.scene.GetActiveCamera());
const bool is_selected = ctx.editor.selections.IsSelected(this);
o_shader->UseShader();
if (o_shader->is_shader_changed)
o_shader->InitShader();
if (is_Uniform_changed || o_shader->is_shader_changed)
o_shader->SetValue("U_obj_trans", o_Transform);
if (cam->is_invUniform_changed || o_shader->is_shader_changed)
o_shader->SetValue("U_cam_trans", cam->o_InvTransform);
if (cam->is_frustum_changed || o_shader->is_shader_changed)
o_shader->SetValue("U_ProjectM", cam->cam_frustum);
if (cam->is_Uniform_changed || cam->is_frustum_changed || o_shader->is_shader_changed)
o_shader->SetValue("Scene_data", 8, cam->cam_floatData.data(), VEC1_ARRAY);
o_shader->SetValue("is_selected", (int)is_selected);
if (using_material)
BindMatertial(o_material.get(), o_shader.get());
if (using_material)
o_material->BindMatTexture();
RenderObjProxy();
#if 1
o_shader->UnuseShader();
#endif
}
void Mesh::RenderObjProxy(bool using_original /*= true*/) const
{
if(!using_original && o_mesh_low != nullptr)
o_mesh_low->RenderObjProxy();
else
o_mesh->RenderObjProxy();
}
void Mesh::SetObjShader(std::string vert, std::string frag)
{
o_shader = std::make_shared<RenderShader>(vert, frag);
//std::cout << "Shader:" << (glGetError()) << "\n";
o_shader->UseShader();
//matrix = glm::translate(matrix, o_position);
o_shader->SetValue("U_ProjectM", o_Transform);
o_shader->SetValue("ID_color", xdzm::get_id_color(GetObjectID()));
o_shader->InitShader = [&] {
o_shader->UseShader();
o_shader->SetValue("RAND_color", xdzm::get_random_color(GetObjectID()));
o_shader->SetValue("U_ProjectM", o_Transform);
o_shader->SetValue("ID_color", xdzm::get_id_color(GetObjectID()));
o_shader->UnuseShader();
};
}
void Mesh::SetTex(Material::MatParaType _type, std::string _name)
{
o_material->SetMatParam(_type, TextureLib::LoadTexture(_name));
}
void Mesh::SetMatColor(Material::MatParaType _type, float _val)
{
o_material->SetMatParam(_type, _val);
}
void Mesh::SetMatColor(Material::MatParaType _type, glm::vec3 _col)
{
o_material->SetMatParam(_type, _col);
}
void Mesh::SetCenter()
{
SetPos(-o_mesh->GetMeshCenter());
}
void Mesh::SetLowPoly(const std::string& path /*= ""*/)
{
o_mesh_low = path == "" ? nullptr : MeshLib::LoadMesh(path);
}