OpenClonk
StdSubMeshInstance Class Reference

#include <StdMesh.h>

Collaboration diagram for StdSubMeshInstance:
[legend]

Classes

struct  Pass
 
struct  TexUnit
 

Public Types

enum  FaceOrdering { FO_Fixed , FO_FarthestToNearest , FO_NearestToFarthest }
 

Public Member Functions

 StdSubMeshInstance (class StdMeshInstance &instance, const StdSubMesh &submesh, float completion)
 
void LoadFacesForCompletion (class StdMeshInstance &instance, const StdSubMesh &submesh, float completion)
 
void CompileFunc (StdCompiler *pComp)
 
const StdMeshFaceGetFaces () const
 
size_t GetNumFaces () const
 
const StdSubMeshGetSubMesh () const
 
unsigned int GetTexturePhase (size_t pass, size_t texunit) const
 
double GetTexturePosition (size_t pass, size_t texunit) const
 
const StdMeshMaterialGetMaterial () const
 
FaceOrdering GetFaceOrdering () const
 

Protected Member Functions

void SetMaterial (const StdMeshMaterial &material)
 
void SetFaceOrdering (class StdMeshInstance &instance, const StdSubMesh &submesh, FaceOrdering ordering)
 
void SetFaceOrderingForClrModulation (class StdMeshInstance &instance, const StdSubMesh &submesh, uint32_t clrmod)
 

Protected Attributes

const StdSubMeshbase
 
std::vector< StdMeshFaceFaces
 
const StdMeshMaterialMaterial
 
std::vector< PassPassData
 
FaceOrdering CurrentFaceOrdering
 

Friends

class StdMeshInstance
 
class StdMeshMaterialUpdate
 

Detailed Description

Definition at line 242 of file StdMesh.h.


Class Documentation

◆ StdSubMeshInstance::Pass

struct StdSubMeshInstance::Pass

Definition at line 295 of file StdMesh.h.

Class Members
vector< TexUnit > TexUnits

◆ StdSubMeshInstance::TexUnit

struct StdSubMeshInstance::TexUnit

Definition at line 284 of file StdMesh.h.

Class Members
unsigned int Phase
float PhaseDelay
double Position

Member Enumeration Documentation

◆ FaceOrdering

Enumerator
FO_Fixed 
FO_FarthestToNearest 
FO_NearestToFarthest 

Definition at line 248 of file StdMesh.h.

249  {
250  FO_Fixed, // don't reorder, keep faces as in mesh
253  };

Constructor & Destructor Documentation

◆ StdSubMeshInstance()

StdSubMeshInstance::StdSubMeshInstance ( class StdMeshInstance instance,
const StdSubMesh submesh,
float  completion 
)

Definition at line 660 of file StdMesh.cpp.

660  :
661  base(&submesh), Material(nullptr), CurrentFaceOrdering(FO_Fixed)
662 {
663 #ifndef USE_CONSOLE
664  LoadFacesForCompletion(instance, submesh, completion);
665 #endif
666 
667  SetMaterial(submesh.GetMaterial());
668 }
const StdMeshMaterial & GetMaterial() const
Definition: StdMesh.h:170
void SetMaterial(const StdMeshMaterial &material)
Definition: StdMesh.cpp:698
const StdMeshMaterial * Material
Definition: StdMesh.h:282
const StdSubMesh * base
Definition: StdMesh.h:278
FaceOrdering CurrentFaceOrdering
Definition: StdMesh.h:301
void LoadFacesForCompletion(class StdMeshInstance &instance, const StdSubMesh &submesh, float completion)
Definition: StdMesh.cpp:670

References StdSubMesh::GetMaterial(), LoadFacesForCompletion(), and SetMaterial().

Here is the call graph for this function:

Member Function Documentation

◆ CompileFunc()

void StdSubMeshInstance::CompileFunc ( StdCompiler pComp)

Definition at line 755 of file StdMesh.cpp.

756 {
757  // TODO: We should also serialize the texture animation positions
758  if(pComp->isDeserializer())
759  {
760  StdCopyStrBuf material_name;
761  pComp->Value(mkNamingAdapt(material_name, "Material"));
762  if(material_name != Material->Name)
763  {
764  const StdMeshMaterial* material = ::MeshMaterialManager.GetMaterial(material_name.getData());
765  if(!material)
766  {
767  StdStrBuf buf;
768  buf.Format(R"(There is no such material with name "%s")", material_name.getData());
769  pComp->excCorrupt(buf.getData());
770  }
771 
772  SetMaterial(*material);
773  }
774  }
775  else
776  {
777  StdCopyStrBuf material_name = Material->Name;
778  pComp->Value(mkNamingAdapt(material_name, "Material"));
779  }
780 }
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
Definition: StdAdaptors.h:92
StdMeshMatManager MeshMaterialManager
void excCorrupt(const char *szMessage,...)
Definition: StdCompiler.h:249
void Value(const T &rStruct)
Definition: StdCompiler.h:161
virtual bool isDeserializer()
Definition: StdCompiler.h:53
const StdMeshMaterial * GetMaterial(const char *material_name) const
StdCopyStrBuf Name
const char * getData() const
Definition: StdBuf.h:442
void Format(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
Definition: StdBuf.cpp:174

References StdCompiler::excCorrupt(), StdStrBuf::Format(), StdStrBuf::getData(), StdMeshMatManager::GetMaterial(), StdCompiler::isDeserializer(), Material, MeshMaterialManager, mkNamingAdapt(), StdMeshMaterial::Name, SetMaterial(), and StdCompiler::Value().

Here is the call graph for this function:

◆ GetFaceOrdering()

FaceOrdering StdSubMeshInstance::GetFaceOrdering ( ) const
inline

Definition at line 272 of file StdMesh.h.

272 { return CurrentFaceOrdering; }

References CurrentFaceOrdering.

◆ GetFaces()

const StdMeshFace* StdSubMeshInstance::GetFaces ( ) const
inline

Definition at line 263 of file StdMesh.h.

263 { return Faces.size() > 0 ? &Faces[0] : nullptr; }
std::vector< StdMeshFace > Faces
Definition: StdMesh.h:280

References Faces.

◆ GetMaterial()

const StdMeshMaterial& StdSubMeshInstance::GetMaterial ( ) const
inline

Definition at line 270 of file StdMesh.h.

270 { return *Material; }

References Material.

Referenced by StdMeshInstance::ExecuteAnimation().

Here is the caller graph for this function:

◆ GetNumFaces()

size_t StdSubMeshInstance::GetNumFaces ( ) const
inline

Definition at line 264 of file StdMesh.h.

264 { return Faces.size(); }

References Faces.

◆ GetSubMesh()

const StdSubMesh& StdSubMeshInstance::GetSubMesh ( ) const
inline

Definition at line 265 of file StdMesh.h.

265 { return *base; }

References base.

Referenced by StdMeshInstance::ReorderFaces().

Here is the caller graph for this function:

◆ GetTexturePhase()

unsigned int StdSubMeshInstance::GetTexturePhase ( size_t  pass,
size_t  texunit 
) const
inline

Definition at line 267 of file StdMesh.h.

267 { return PassData[pass].TexUnits[texunit].Phase; }
std::vector< Pass > PassData
Definition: StdMesh.h:300

References PassData.

◆ GetTexturePosition()

double StdSubMeshInstance::GetTexturePosition ( size_t  pass,
size_t  texunit 
) const
inline

Definition at line 268 of file StdMesh.h.

268 { return PassData[pass].TexUnits[texunit].Position; }

References PassData.

◆ LoadFacesForCompletion()

void StdSubMeshInstance::LoadFacesForCompletion ( class StdMeshInstance instance,
const StdSubMesh submesh,
float  completion 
)

Definition at line 670 of file StdMesh.cpp.

671 {
672 #ifndef USE_CONSOLE
673  // First: Copy all faces
674  Faces.resize(submesh.GetNumFaces());
675  for (unsigned int i = 0; i < submesh.GetNumFaces(); ++i)
676  Faces[i] = submesh.GetFace(i);
677 
678  if(completion < 1.0f)
679  {
680  // Second: Order by Y position. StdMeshInstanceFaceOrderingCmpPred orders by Z position,
681  // however we can simply give an appropriate transformation matrix to the face ordering.
682  // At this point, all vertices are in the OGRE coordinate frame, and Z in OGRE equals
683  // Y in Clonk, so we are fine without additional transformation.
684  const StdMeshVertex* vertices;
685  if(submesh.GetNumVertices() > 0)
686  vertices = &submesh.GetVertices()[0];
687  else
688  vertices = &instance.GetSharedVertices()[0];
689  SortFacesArray(vertices, Faces, FO_FarthestToNearest, StdMeshMatrix::Identity());
690 
691  // Third: Only use the first few ones
692  assert(submesh.GetNumFaces() >= 1);
693  Faces.resize(Clamp<unsigned int>(static_cast<unsigned int>(completion * submesh.GetNumFaces() + 0.5), 1, submesh.GetNumFaces()));
694  }
695 #endif
696 }
static StdMeshMatrix Identity()
const StdMeshFace & GetFace(size_t i) const
Definition: StdMesh.h:167
size_t GetNumVertices() const
Definition: StdMesh.h:165
const std::vector< Vertex > & GetVertices() const
Definition: StdMesh.h:163
size_t GetNumFaces() const
Definition: StdMesh.h:168

References Faces, FO_FarthestToNearest, StdSubMesh::GetFace(), StdSubMesh::GetNumFaces(), StdSubMesh::GetNumVertices(), StdMeshInstance::GetSharedVertices(), StdSubMesh::GetVertices(), and StdMeshMatrix::Identity().

Referenced by SetFaceOrdering(), and StdSubMeshInstance().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetFaceOrdering()

void StdSubMeshInstance::SetFaceOrdering ( class StdMeshInstance instance,
const StdSubMesh submesh,
FaceOrdering  ordering 
)
protected

Definition at line 727 of file StdMesh.cpp.

728 {
729 #ifndef USE_CONSOLE
730  if (CurrentFaceOrdering != ordering)
731  {
732  CurrentFaceOrdering = ordering;
733  if (ordering == FO_Fixed)
734  {
735  LoadFacesForCompletion(instance, submesh, instance.GetCompletion());
736  }
737  }
738 #endif
739 }

References CurrentFaceOrdering, FO_Fixed, StdMeshInstance::GetCompletion(), and LoadFacesForCompletion().

Referenced by SetFaceOrderingForClrModulation().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetFaceOrderingForClrModulation()

void StdSubMeshInstance::SetFaceOrderingForClrModulation ( class StdMeshInstance instance,
const StdSubMesh submesh,
uint32_t  clrmod 
)
protected

Definition at line 741 of file StdMesh.cpp.

742 {
743 #ifndef USE_CONSOLE
744  bool opaque = Material->IsOpaque();
745 
746  if(!opaque)
747  SetFaceOrdering(instance, submesh, FO_FarthestToNearest);
748  else if( ((clrmod >> 24) & 0xff) != 0xff)
749  SetFaceOrdering(instance, submesh, FO_NearestToFarthest);
750  else
751  SetFaceOrdering(instance, submesh, FO_Fixed);
752 #endif
753 }
bool IsOpaque() const
void SetFaceOrdering(class StdMeshInstance &instance, const StdSubMesh &submesh, FaceOrdering ordering)
Definition: StdMesh.cpp:727

References FO_FarthestToNearest, FO_Fixed, FO_NearestToFarthest, StdMeshMaterial::IsOpaque(), Material, and SetFaceOrdering().

Here is the call graph for this function:

◆ SetMaterial()

void StdSubMeshInstance::SetMaterial ( const StdMeshMaterial material)
protected

Definition at line 698 of file StdMesh.cpp.

699 {
700  Material = &material;
701 
702 #ifndef USE_CONSOLE
703  // Setup initial texture animation data
704  assert(Material->BestTechniqueIndex >= 0);
706  PassData.resize(technique.Passes.size());
707  for (unsigned int i = 0; i < PassData.size(); ++i)
708  {
709  const StdMeshMaterialPass& pass = technique.Passes[i];
710  // Clear from previous material
711  PassData[i].TexUnits.clear();
712 
713  for (unsigned int j = 0; j < pass.TextureUnits.size(); ++j)
714  {
715  TexUnit unit;
716  unit.Phase = 0;
717  unit.PhaseDelay = 0.0f;
718  unit.Position = 0.0;
719  PassData[i].TexUnits.push_back(unit);
720  }
721  }
722 
723  // TODO: Reset face ordering
724 #endif
725 }
std::vector< StdMeshMaterialTechnique > Techniques
std::vector< StdMeshMaterialTextureUnit > TextureUnits
std::vector< StdMeshMaterialPass > Passes

References StdMeshMaterial::BestTechniqueIndex, Material, PassData, StdMeshMaterialTechnique::Passes, StdSubMeshInstance::TexUnit::Phase, StdSubMeshInstance::TexUnit::PhaseDelay, StdSubMeshInstance::TexUnit::Position, StdMeshMaterial::Techniques, and StdMeshMaterialPass::TextureUnits.

Referenced by CompileFunc(), StdSubMeshInstance(), and StdMeshMaterialUpdate::Update().

Here is the caller graph for this function:

Friends And Related Function Documentation

◆ StdMeshInstance

friend class StdMeshInstance
friend

Definition at line 244 of file StdMesh.h.

◆ StdMeshMaterialUpdate

friend class StdMeshMaterialUpdate
friend

Definition at line 245 of file StdMesh.h.

Member Data Documentation

◆ base

const StdSubMesh* StdSubMeshInstance::base
protected

Definition at line 278 of file StdMesh.h.

Referenced by GetSubMesh().

◆ CurrentFaceOrdering

FaceOrdering StdSubMeshInstance::CurrentFaceOrdering
protected

Definition at line 301 of file StdMesh.h.

Referenced by GetFaceOrdering(), StdMeshInstance::ReorderFaces(), and SetFaceOrdering().

◆ Faces

std::vector<StdMeshFace> StdSubMeshInstance::Faces
protected

◆ Material

const StdMeshMaterial* StdSubMeshInstance::Material
protected

◆ PassData

std::vector<Pass> StdSubMeshInstance::PassData
protected

The documentation for this class was generated from the following files: