/*************************************************************************/ /* File : CKPatchMesh.h */ /* Author : Romain Sididris */ /* */ /* Virtools SDK */ /* Copyright (c) Virtools 2000, All Rights Reserved. */ /*************************************************************************/ #if !defined(CKPATCHMESH_H) || defined(CK_3DIMPLEMENTATION) #define CKPATCHMESH_H "$Id:$" #ifndef CK_3DIMPLEMENTATION #include "CKMesh.h" /*************************************************************************** Summary: Structure holding the details of a patch Remarks: + This structure carries the details associated with patch, such as type, smoothing group, edges, vertices, vectors, material. {Image:CKPatch} + The corner control points of a patch are called verts. + The edge control points and interiors are called vecs + Interior points are automatically computed when tesselating a patch but the result is stored inside the vecs array. + The smoothing group is a DWORD mask, if the binary AND of the smoothing group value of two adjacent patches is not 0 then they are smoothed together otherwise there is a sharp edge between the two patches. The default value of a patch smoothing group is 0xFFFFFFFF which means all patches are smoothed together. See Also: CKPatchMesh,CKPatchEdge,CKTVPatch ****************************************************************************/ typedef struct CKPatch { CKDWORD type; // CK_PATCH_FLAGS ( 3 for a tri patch , 4 for a quad patch) CKDWORD SmoothingGroup; // Smoothing group of this patch, short int v[4]; // 3 or 4 indices of the corner verts. short int vec[8]; // 6 or 8 indices of the edge vecs. short int interior[4]; // Can have three or four interior vecs. short int edge[4]; // Indices of the 3 or 4 edges of this patches CK_ID Material; // Material CK_ID for this patch. (CKPatchMesh::SetPatchMaterial) VxVector* auxs; // An array of 9 auxiliary points instancied at runtime for tri patches (used internally DO NOT modify) CKPatch() { SmoothingGroup = 0xFFFFFFFF; Material = 0; auxs = NULL;} ~CKPatch() { delete[] auxs;} } CKPatch; /*************************************************************************** Summary: Structure holding the details of the edge of a patch Remarks: + A patch edge holds the index of the verts and vecs it is made of. It also contains the two patches that share this edge (patch2 is -1) when this edge belongs to only one patch. See Also: CKPatchMesh,CKPatch,CKTVPatch. ****************************************************************************/ typedef struct CKPatchEdge { short int v1; // Index of first corner vert short int vec12; // First vec between v1 and v2 short int vec21; // Second vec between v1 and v2 short int v2; // Index of second corner vert short int patch1; // Index of first patch short int patch2; // Index of second patch } CKPatchEdge; /*************************************************************************** Summary: Structure holding the texture coordinates details of a patch Remarks: + The CKTVPatch structure holds the 3 or 4 indices of the texture coordinates of the corner points of a patch. See Also:CKPatch,CKPatchMesh ****************************************************************************/ typedef struct CKTVPatch { short int tv[4]; // Index of textures coordinates } CKTVPatch; typedef enum CK_PATCHMESH_FLAGS { CK_PATCHMESH_UPTODATE =1, // Indicates the mesh is uptodate. CK_PATCHMESH_BUILDNORMALS =2, // Flag to indicate normals to be computed. CK_PATCHMESH_MATERIALSUPTODATE =4, // Flag to indicate patch materials have been changed. CK_PATCHMESH_AUTOSMOOTH =8, // Automatically computes vecs and interiors from control point position. } CK_PATCHMESH_FLAGS; /*************************************************************************** {filename:CK_PATCH_FLAGS} Summary: Type of a patch (Triangle or Quad). See Also:CKPatch,CKPatchMesh ****************************************************************************/ typedef enum CK_PATCH_FLAGS { CK_PATCH_TRI =3, // Triangle Patch. CK_PATCH_QUAD =4, // Quad Patch. } CK_PATCH_FLAGS; #undef CK_PURE #define CK_PURE = 0 /************************************************************************** {filename:CKPatchMesh} Summary: Representation of the geometry of a 3Dobject using bezier patches. Remarks: + The CKPatchMesh Class derives from the CKMesh class. {Image:CKPatch} + It is made up of array of bezier patches (triangular or quadrangular) which can be tesselated given an iteration count to construct a standard mesh made up of triangles. {Image:PatchTess} + In the current implementation only the uniform tesselation is supported. It generates a list of strip primitives per material for maximum performances. + The advantages of a patch mesh is that it use less memory on disk. + Its class id is CKCID_PATCHMESH See also: Using Meshes,CK3dEntity,CKMesh,CKPatch *****************************************************************************/ class CKPatchMesh:public CKMesh { public: #endif /************************************************************************** Summary: Converts a mesh(CKMesh) to a bezier patch(CKPatchMesh) Remarks: + This method is not implemented {Secret} *****************************************************************************/ virtual CKERROR FromMesh(CKMesh* m) CK_PURE; /************************************************************************** Summary: Converts a bezier patch(CKPatchMesh) to a mesh(CKMesh). Remarks: + This method is not implemented {Secret} *****************************************************************************/ virtual CKERROR ToMesh(CKMesh* m,int stepcount) CK_PURE; /************************************************************************** Summary: Sets the number of iteration steps to be used for tesselation. Arguments: count: Step count for tesselation See also: GetIterationCount *****************************************************************************/ virtual void SetIterationCount(int count) CK_PURE; /************************************************************************** Summary: Gets the number of iteration steps used for tesselation. Return Value: Step count for tesselation. See also: SetIterationCount *****************************************************************************/ virtual int GetIterationCount() CK_PURE; //------------------------------------- // Mesh building /************************************************ Summary: Builds the base mesh for rendering. Remarks: + This method computes the base mesh vertices and face data to be rendered. + This method is automatically called when vertices have been moved (notified by CKMesh::ModifierVertexMove for example) or the tesselation level has changed before rendering. See Also: CleanRenderMesh ************************************************/ virtual void BuildRenderMesh() CK_PURE; virtual void CleanRenderMesh() CK_PURE; virtual void Clear() CK_PURE; virtual void ComputePatchAux(int index) CK_PURE; virtual void ComputePatchInteriors(int index) CK_PURE; virtual CKDWORD GetPatchFlags() CK_PURE; virtual void SetPatchFlags(CKDWORD Flags) CK_PURE; //------------------------------------------- // Control Points /************************************************ Summary: Sets verts and vecs counts of the patchmesh. Arguments: VertCount: Number of verts (corner control points) to be set. VecCount: Number of vects (edge and interior control points) to be set. Remarks: + See CKPatch for more details on the difference between verts and vecs. See Also: CKPatch,GetVertCount,SetVert,GetVert,SetVec,GetVec ************************************************/ virtual void SetVertVecCount(int VertCount,int VecCount) CK_PURE; /************************************************ Summary: Gets verts (corner control points) count of the mesh. Return Value: Number of verts in the patchmesh. See Also: CKPatch,GetVecCount,SetVert,GetVert,SetVec,GetVec ************************************************/ virtual int GetVertCount() CK_PURE; /************************************************ Summary: Sets a corner control point position. Arguments: index: Index of the vert whose position is to be set. cp: Position. See Also: GetVert, GetVerts,GetVertCount ************************************************/ virtual void SetVert(int index,VxVector* cp) CK_PURE; /************************************************ Summary: Gets a corner control point position. Arguments: index: Index of the vert whose position is to be get. cp: Position to be filled. See Also: SetVert, GetVerts,GetVertCount ************************************************/ virtual void GetVert(int index,VxVector* cp) CK_PURE; /************************************************ Summary: Gets all corner control points Return Value: A pointer to the list of verts (corner control points). See Also: SetVert,GetVert,GetVertCount ************************************************/ virtual VxVector* GetVerts() CK_PURE; /************************************************ Summary: Gets vecs (edge and interior control points) count of the mesh. Return Value: Number of verts in the patchmesh. See Also: CKPatch,GetVecCount,SetVert,GetVert,SetVec,GetVec ************************************************/ virtual int GetVecCount() CK_PURE; /************************************************ Summary: Sets a edge control point position. Arguments: index: Index of the vec whose position is to be set. cp: Position. See Also: SetVec, GetVecs,GetVecCount ************************************************/ virtual void SetVec(int index,VxVector* cp) CK_PURE; /************************************************ Summary: Gets a edge control point position. Arguments: index: Index of the vec whose position is to be get. cp: Position to be filled. See Also: SetVec, GetVecs,GetVecCount ************************************************/ virtual void GetVec(int index,VxVector* cp) CK_PURE; /************************************************ Summary: Gets all edge and interiors control points Return Value: A pointer to the list of vecs (edge and interior control points). See Also: SetVec,GetVec,GetVecCount ************************************************/ virtual VxVector* GetVecs() CK_PURE; //-------------------------------------------- // Edges /************************************************ Summary: Sets the number of edges. Arguments: count: Number of edges to be set. See Also: GetEdgeCount,SetEdge,GetEdge,GetEdges ************************************************/ virtual void SetEdgeCount(int count) CK_PURE; /************************************************ Summary: Returns the number of edges. Return Value: Number of edges. See Also: SetEdgeCount,SetEdge,GetEdge,GetEdges ************************************************/ virtual int GetEdgeCount() CK_PURE; /************************************************ Summary: Sets a given edge data. Arguments: index: Index of the edge to be set. edge: A pointer to a CKPatchEdge structure containing the edge data. See Also: SetEdgeCount,GetEdgeCount,GetEdge,GetEdges,CKPatchEdge ************************************************/ virtual void SetEdge(int index,CKPatchEdge* edge) CK_PURE; /************************************************ Summary: Gets a given edge data. Arguments: index: Index of the edge to be get. edge: A pointer to a CKPatchEdge structure that will be filled with the edge data. See Also: SetEdgeCount,GetEdgeCount,SetEdge,GetEdges,CKPatchEdge ************************************************/ virtual void GetEdge(int index,CKPatchEdge* edge) CK_PURE; /************************************************ Summary: Gets a pointer to the list of edges. See Also: SetEdgeCount,GetEdgeCount,SetEdge,GetEdge,CKPatchEdge ************************************************/ virtual CKPatchEdge* GetEdges() CK_PURE; //--------------------------------------------- // Patches /************************************************ Summary: Sets the number of patches. Arguments: count: Number of patches to be set for the patchmesh. See Also: GetPatchCount,SetPatch,GetPatch,GetPatches ************************************************/ virtual void SetPatchCount(int count) CK_PURE; /************************************************ Summary: Gets the number of patches. Return Value: Number of patches. See Also: SetPatchCount,SetPatch,GetPatch,GetPatches ************************************************/ virtual int GetPatchCount() CK_PURE; /************************************************ Summary: Sets the description of a given patch. Arguments: index: Index of the patch to be set. p: A pointer to a CKPatch structure containing the description of the patch. See Also: CKPatch,SetPatchCount,GetPatch,GetPatches,SetPatchSM,SetPatchMaterial ************************************************/ virtual void SetPatch(int index,CKPatch* p) CK_PURE; /************************************************ Summary: Gets the description of a given patch. Arguments: index: Index of the patch to be set. p: A pointer to a CKPatch structure to be filled with the description of the patch. See Also: CKPatch,SetPatchCount,SetPatch,GetPatches,SetPatchSM,SetPatchMaterial ************************************************/ virtual void GetPatch(int index,CKPatch* p) CK_PURE; /************************************************ Summary: Gets the smoothing group of a patch. Arguments: Index: Index of patch whose smoothing group is to be obtained. Return Value: Smoothing group of the patch. Remarks: + The smoothing group is a DWORD mask, if the binary AND of the smoothing group value of two adjacent patches is not 0 then they are smoothed together otherwise there is a sharp edge between the two patches. The default value of a patch smoothing group is 0xFFFFFFFF which means all patches are smoothed together. See Also: SetPatchSM,SetPatch,CKPatch ************************************************/ virtual CKDWORD GetPatchSM(int index) CK_PURE; /************************************************ Summary: Sets the smoothing group for the patch. Arguments: index: Index of patch whose smoothing group is to be set. smoothing: Smoothing group of the patch to be set. Remarks: + The smoothing group is a DWORD mask, if the binary AND of the smoothing group value of two adjacent patches is not 0 then they are smoothed together otherwise there is a sharp edge between the two patches. The default value of a patch smoothing group is 0xFFFFFFFF which means all patches are smoothed together. See Also: GetPatchSM,SetPatch,CKPatch ************************************************/ virtual void SetPatchSM(int index,CKDWORD smoothing) CK_PURE; /************************************************ Summary: Gets the material used on a given patch. Arguments: Index: Index of patch whose material is to be obtained. Return Value: Pointer to the material. See Also: SetPatchMaterial,CKPatch ************************************************/ virtual CKMaterial* GetPatchMaterial(int index) CK_PURE; /************************************************ Summary: Sets the material used for a given patch. Arguments: index: Index of patch whose material is to be obtained. mat: A Pointer to the material to use for this patch. See Also: GetPatchMaterial,CKPatch ************************************************/ virtual void SetPatchMaterial(int index,CKMaterial* mat) CK_PURE; /************************************************ Summary: Gets a pointer to the list of patches. See Also: CKPatch,SetPatchCount,SetPatch,GetPatch ************************************************/ virtual CKPatch* GetPatches() CK_PURE; //------------------------------------------- // Texture Patches /************************************************ Summary: Sets the number of texture patches Arguments: count: Number of texture patches to be set. Channel: Index of the channel (-1 for default texture coordinates or >=0 for an additionnal material channel). Remarks: + The number of texture patches can be 0 (no texturing ) otherwise it must be equal to the number of patches. See Also: SetPatchCount,GetTVPatchCount ************************************************/ virtual void SetTVPatchCount(int count,int Channel=-1) CK_PURE; /************************************************ Summary: Gets the number of texture patches Arguments: Channel: Index of the channel (-1 for default texture coordinates or >=0 for an additionnal material channel). Remarks: + The number of texture patches can be 0 (no texturing ) otherwise it must be equal to the number of patches. See Also: SetPatchCount,SetTVPatchCount ************************************************/ virtual int GetTVPatchCount(int Channel=-1) CK_PURE; /************************************************ Summary: Sets the mapping of a given patch. Arguments: index: Index of the patch which mapping should be set. tvpatch: A pointer to a CKTVPatch structure that contains the indices of the texture coordinates of the corner points of the patch. Channel: Index of the channel (-1 for default texture coordinates or >=0 for an additionnal material channel). See Also: GetTVPatch, GetTVPatches,GetTVPatchCount,SetTVPatchCount,SetTVCount ************************************************/ virtual void SetTVPatch(int index,CKTVPatch* tvpatch,int Channel=-1) CK_PURE; /************************************************ Summary: Gets the mapping of a given patch. Arguments: index: Index of the patch which mapping should be set. tvpatch: A pointer to a CKTVPatch structure that will be filled with the indices of the texture coordinates of the corner points of the patch. Channel: Index of the channel (-1 for default texture coordinates or >=0 for an additionnal material channel). See Also: SetTVPatch, GetTVPatches,GetTVPatchCount,SetTVPatchCount,SetTVCount ************************************************/ virtual void GetTVPatch(int index,CKTVPatch* tvpatch,int Channel=-1) CK_PURE; /************************************************ Summary: Gets a pointer to the list of texture patches. Arguments: Channel: Index of the channel (-1 for default texture coordinates or >=0 for an additionnal material channel). See Also: SetTVPatch, GetTVPatch,GetTVPatchCount,SetTVPatchCount,SetTVCount ************************************************/ virtual CKTVPatch* GetTVPatches(int Channel=-1) CK_PURE; //----------------------------------------- // Texture Verts /************************************************ Summary: Sets the number of the texture coordinates for a given channel. Arguments: count: Number of texture vertices to be set. Channel: Index of the channel (-1 for default texture coordinates or >=0 for an additionnal material channel). See Also: GetTVCount,GetTVPatchCount,SetTV,GetTV,GetTVs ************************************************/ virtual void SetTVCount(int count,int Channel=-1) CK_PURE; /************************************************ Summary: Returns the number of the texture coordinates for a given channel. Arguments: Channel: Index of the channel (-1 for default texture coordinates or >=0 for an additionnal material channel). Return Value: Number of texture coordinates. See Also: SetTVCount,SetTV,GetTV,GetTVs,GetTVPatchCount ************************************************/ virtual int GetTVCount(int Channel=-1) CK_PURE; /************************************************ Summary: Sets the texture coordinate values. Arguments: index: Index of the texture vertex whose value has to be set. u: U texture coordinate value. v: V texture coordinate value. Channel: Index of the channel (-1 for default texture coordinates or >=0 for an additionnal material channel). See Also: GetTV, GetTVs,SetTVCount,SetTVPatch ************************************************/ virtual void SetTV(int index,float u,float v,int Channel=-1) CK_PURE; /************************************************ Summary: Gets the texture coordinate values. Arguments: index: Index of the texture vertex whose value has to be retrieve. u: U texture coordinate value. v: V texture coordinate value. Channel: Index of the channel (-1 for default texture coordinates or >=0 for an additionnal material channel). See Also: GetTV, GetTVs,SetTVCount,SetTVPatch ************************************************/ virtual void GetTV(int index,float* u,float* v,int Channel=-1) CK_PURE; /************************************************ Summary: Gets a pointer to the list of texture coordinates. Arguments: Channel: Index of the channel (-1 for default texture coordinates or >=0 for an additionnal material channel). See Also: GetTV, SetTV,GetTVCount,GetTVPatchCount ************************************************/ virtual VxUV* GetTVs(int Channel=-1) CK_PURE; /************************************************* Summary: Dynamic cast operator. Arguments: iO: A pointer to a CKObject to cast. Return Value: iO casted to the appropriate class or NULL if iO is not from the required class . Example: CKObject* Object; CKAnimation* anim = CKAnimation::Cast(Object); Remarks: *************************************************/ static CKPatchMesh* Cast(CKObject* iO) { return CKIsChildClassOf(iO,CKCID_PATCHMESH)?(CKPatchMesh*)iO:NULL; } #ifndef CK_3DIMPLEMENTATION }; #endif #endif