Skip to content

File Mesh.cpp

File List > scene > 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);
}