#pragma once #include "lroom_manager.h" class LHelper { public: struct LFace { Vector3 m_Pos[3]; Vector3 m_Norm[3]; int m_index[3]; String ToString() const; }; // unique vert struct LVert { Vector3 m_Pos; Vector3 m_Norm; Vector2 m_UV; Vector2 m_UV2; bool ApproxEqual(const LVert &o) const; }; // the merged mesh data to be passed for unmerging meshes struct LMerged { PoolVector m_Verts; PoolVector m_Norms; PoolVector m_UV2s; PoolVector m_Inds; int m_nFaces; // precreate LFaces LVector m_LFaces; }; // one function to do the whole internal workflow MeshInstance * CreateLightmapProxy(LRoomManager &manager); // for lightmapping bool MergeSOBs(LRoomManager &manager, MeshInstance * pMerged); // take the UV2 coords from the merged mesh and attach these to the SOB meshes bool UnMergeSOBs(LRoomManager &manager, MeshInstance * pMerged); // bool UnMergeSOBs(LRoomManager &manager, const PoolVector &uv2s); // main function for getting merged uv2 back to sobs bool TransferUV2(const MeshInstance &mi_from, MeshInstance &mi_to); private: void Merge_MI(const MeshInstance &mi, PoolVector &verts, PoolVector &norms, PoolVector &inds); bool UnMerge_SOB(MeshInstance &mi, LMerged &merged); unsigned int FindMatchingVertex(const PoolVector &uvs, const Vector2 &uv1) const; bool BakeLightmap(BakedLightmap &baked_lightmap, MeshInstance * pMerged); bool LightmapUnwrap(Ref am, const Transform &trans); // bool LightmapUnwrap(const PoolVector &p_verts, const PoolVector &p_normals, const PoolVector &p_inds, PoolVector &r_uvs); //Error lightmap_unwrap(ArrayMesh &am, const Transform &p_base_transform, float p_texel_size); int DebugCountUVs(MeshInstance &mi); void Transform_Verts(const PoolVector &ptsLocal, PoolVector &ptsWorld, const Transform &tr) const; void Transform_Norms(const PoolVector &normsLocal, PoolVector &normsWorld, const Transform &tr) const; int DoFacesMatch(const LFace& sob_f, const LFace &m_face) const; bool DoFaceVertsApproxMatch(const LFace& sob_f, const LFace &m_face, int c0, int c1) const; bool DoPosNormsApproxMatch(const Vector3 &a_pos, const Vector3 &a_norm, const Vector3 &b_pos, const Vector3 &b_norm) const; int FindOrAddVert(LVector &uni_verts, const LVert &vert) const; void SetOwnerRecursive(Node * pNode, Node * pOwner); bool FillMergedFromMesh(LMerged &merged, const MeshInstance &mesh); // bool xatlas_mesh_lightmap_unwrap(float p_texel_size, const float *p_vertices, const float *p_normals, int p_vertex_count, const int *p_indices, const int *p_face_materials, int p_index_count, float **r_uv, int **r_vertex, int *r_vertex_count, int **r_index, int *r_index_count, int *r_size_hint_x, int *r_size_hint_y); };