#include <assert.h>#include <string.h>#include <math.h>#include <stdio.h>#include "body.h"#include "body._h"#include "ram.h"#include "errorlog.h"Go to the source code of this file.
Defines | |
| #define | MAX(aa, bb) ( (aa)>(bb)?(aa):(bb) ) |
| #define | MIN(aa, bb) ( (aa)<(bb)?(aa):(bb) ) |
| #define | GE_BODY_TOLERANCE (0.001f) |
| #define | GE_BODY_GEOMETRY_NAME "Geometry" |
| #define | GE_BODY_BITMAP_DIRECTORY_NAME "Bitmaps" |
| #define | GE_BODY_FILE_TYPE 0x5E444F42 |
| #define | GE_BODY_FILE_VERSION 0x00F1 |
Functions | |
| geBoolean GENESISCC | geBody_SanityCheck (const geBody *B) |
| geBoolean GENESISCC | geBody_IsValid (const geBody *B) |
| geBody *GENESISCC | geBody_CreateNull (void) |
| void GENESISCC | geBody_DestroyPossiblyIncompleteBody (geBody **PB) |
| geBody *GENESISCC | geBody_Create (void) |
| void GENESISCC | geBody_Destroy (geBody **PB) |
| geBoolean GENESISCC | geBody_GetGeometryStats (const geBody *B, int lod, int *Vertices, int *Faces, int *Normals) |
| int GENESISCC | geBody_GetBoneCount (const geBody *B) |
| void GENESISCC | geBody_GetBone (const geBody *B, int BoneIndex, const char **BoneName, geXForm3d *Attachment, int *ParentBoneIndex) |
| int32 GENESISCC | geBody_GetBoneNameChecksum (const geBody *B) |
| geBoolean GENESISCC | geBody_GetBoundingBox (const geBody *B, int BoneIndex, geVec3d *MinimumBoxCorner, geVec3d *MaximumBoxCorner) |
| void GENESISCC | geBody_SetBoundingBox (geBody *B, int BoneIndex, const geVec3d *MinimumBoxCorner, const geVec3d *MaximumBoxCorner) |
| geBoolean GENESISCC | geBody_GetBoneByName (const geBody *B, const char *BoneName, int *pBoneIndex, geXForm3d *Attachment, int *pParentBoneIndex) |
| int GENESISCC | geBody_GetMaterialCount (const geBody *B) |
| geBoolean GENESISCC | geBody_XSkinVertexCompare (const geBody_XSkinVertex *SV1, const geBody_XSkinVertex *SV2) |
| void GENESISCC | geBody_SwapVertexIndices (geBody *B, geBody_Index Index1, geBody_Index Index2) |
| void GENESISCC | geBody_ChangeVertexIndex (geBody *B, geBody_Index Index1, geBody_Index Index2) |
| void GENESISCC | geBody_SortSkinVertices (geBody *B) |
| geBoolean GENESISCC | geBody_AddSkinVertex (geBody *B, const geVec3d *Vertex, geFloat U, geFloat V, geBody_Index BoneIndex, geBody_Index *Index) |
| geBoolean GENESISCC | geBody_AddNormal (geBody *B, const geVec3d *Normal, geBody_Index BoneIndex, geBody_Index *Index) |
| geBoolean GENESISCC | geBody_AddToFaces (geBody *B, geBody_Triangle *F, int DetailLevel) |
| geBoolean GENESISCC | geBody_AddFace (geBody *B, const geVec3d *Vertex1, const geVec3d *Normal1, geFloat U1, geFloat V1, int BoneIndex1, const geVec3d *Vertex2, const geVec3d *Normal2, geFloat U2, geFloat V2, int BoneIndex2, const geVec3d *Vertex3, const geVec3d *Normal3, geFloat U3, geFloat V3, int BoneIndex3, int MaterialIndex) |
| geBoolean GENESISCC | geBody_AddMaterial (geBody *B, const char *MaterialName, geBitmap *Bitmap, geFloat Red, geFloat Green, geFloat Blue, int *MaterialIndex) |
| geBoolean GENESISCC | geBody_GetMaterial (const geBody *B, int MaterialIndex, const char **MaterialName, geBitmap **Bitmap, geFloat *Red, geFloat *Green, geFloat *Blue) |
| geBoolean GENESISCC | geBody_SetMaterial (geBody *B, int MaterialIndex, geBitmap *Bitmap, geFloat Red, geFloat Green, geFloat Blue) |
| geBoolean GENESISCC | geBody_AddBone (geBody *B, int ParentBoneIndex, const char *BoneName, const geXForm3d *AttachmentMatrix, int *BoneIndex) |
| geBoolean GENESISCC | geBody_ComputeLevelsOfDetail (geBody *B,int Levels) |
| geBoolean GENESISCC | geBody_ReadGeometry (geBody *B, geVFile *pFile) |
| geBody *GENESISCC | geBody_CreateFromFile (geVFile *pFile) |
| geBoolean GENESISCC | geBody_WriteGeometry (const geBody *B, geVFile *pFile) |
| geBoolean GENESISCC | geBody_WriteToFile (const geBody *B, geVFile *pFile) |
|
|
Definition at line 923 of file body.c. Referenced by geBody_CreateFromFile(), and geBody_WriteToFile(). |
|
|
Definition at line 925 of file body.c. Referenced by geBody_ReadGeometry(), and geBody_WriteGeometry(). |
|
|
Definition at line 926 of file body.c. Referenced by geBody_ReadGeometry(), and geBody_WriteGeometry(). |
|
|
Definition at line 922 of file body.c. Referenced by geBody_CreateFromFile(), and geBody_WriteToFile(). |
|
|
Definition at line 402 of file body.c. Referenced by geBody_AddNormal(), and geBody_XSkinVertexCompare(). |
|
|
|
|
|
|
|
||||||||||||||||||||||||
|
Definition at line 859 of file body.c. References geBody_Bone::AttachmentMatrix, B, geBody_Bone::BoundingBoxMax, geBody_Bone::BoundingBoxMin, ERR_BODY_ENOMEM, GE_BODY_NO_PARENT_BONE, GE_BODY_REALLY_BIG_NUMBER, GE_FALSE, GE_RAM_REALLOC_ARRAY, GE_TRUE, geBody_Index, geBody_IsValid(), geBoolean, geErrorLog_Add, GENESISCC, geStrBlock_Append(), geVec3d_Set(), NULL, and geBody_Bone::ParentBoneIndex.
00864 {
00865 geBody_Bone *NewBones;
00866 assert( B != NULL );
00867 assert( BoneName != NULL );
00868 assert( BoneIndex != NULL );
00869 assert( geBody_IsValid(B) != GE_FALSE );
00870
00871 assert( ParentBoneIndex < B->BoneCount );
00872 assert( ( ParentBoneIndex >= 0) || (ParentBoneIndex == GE_BODY_NO_PARENT_BONE));
00873 assert( B->BoneCount >= 0 );
00874
00875 NewBones = GE_RAM_REALLOC_ARRAY( B->BoneArray,
00876 geBody_Bone, (B->BoneCount+1) );
00877 if ( NewBones == NULL )
00878 {
00879 geErrorLog_Add(ERR_BODY_ENOMEM, NULL);
00880 return GE_FALSE;
00881 }
00882
00883 B->BoneArray = NewBones;
00884 if (geStrBlock_Append(&(B->BoneNames),BoneName) == GE_FALSE)
00885 {
00886 geErrorLog_Add(ERR_BODY_ENOMEM, NULL);
00887 return GE_FALSE;
00888 }
00889
00890 {
00891 geBody_Bone *Bone = &(B->BoneArray[B->BoneCount]);
00892 geVec3d_Set(&(Bone->BoundingBoxMin),
00893 GE_BODY_REALLY_BIG_NUMBER,GE_BODY_REALLY_BIG_NUMBER,GE_BODY_REALLY_BIG_NUMBER);
00894 geVec3d_Set(&(Bone->BoundingBoxMax),
00895 -GE_BODY_REALLY_BIG_NUMBER,-GE_BODY_REALLY_BIG_NUMBER,-GE_BODY_REALLY_BIG_NUMBER);
00896 Bone->AttachmentMatrix = *AttachmentMatrix;
00897 Bone->ParentBoneIndex = (geBody_Index)ParentBoneIndex;
00898 }
00899 *BoneIndex = B->BoneCount;
00900 B->BoneCount++;
00901 return GE_TRUE;
00902 }
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definition at line 681 of file body.c. References B, GE_BODY_HIGHEST_LOD, GE_FALSE, GE_TRUE, geBody_AddNormal(), geBody_AddSkinVertex(), geBody_AddToFaces(), geBody_Index, geBody_IsValid(), geBody_SortSkinVertices(), geBoolean, GENESISCC, geBody_Triangle::MaterialIndex, geBody_Triangle::NormalIndex, NULL, U1, U2, V1, V2, and geBody_Triangle::VtxIndex.
00689 {
00690 geBody_Triangle F;
00691
00692 assert( B != NULL );
00693 assert( Vertex1 != NULL );
00694 assert( Normal1 != NULL );
00695 assert( geBody_IsValid(B) != GE_FALSE );
00696
00697 assert( BoneIndex1 >= 0 );
00698 assert( BoneIndex1 < B->BoneCount );
00699
00700 assert( Vertex2 != NULL );
00701 assert( Normal2 != NULL );
00702 assert( BoneIndex2 >= 0 );
00703 assert( BoneIndex2 < B->BoneCount );
00704
00705 assert( Vertex3 != NULL );
00706 assert( Normal3 != NULL );
00707 assert( BoneIndex3 >= 0 );
00708 assert( BoneIndex3 < B->BoneCount );
00709
00710 assert( MaterialIndex >= 0 );
00711 assert( MaterialIndex < B->MaterialCount );
00712
00713 if (geBody_AddSkinVertex(B,Vertex1,U1,V1,(geBody_Index)BoneIndex1,&(F.VtxIndex[0]))==GE_FALSE)
00714 { // error already recorded
00715 return GE_FALSE;
00716 }
00717 if (geBody_AddSkinVertex(B,Vertex2,U2,V2,(geBody_Index)BoneIndex2,&(F.VtxIndex[1]))==GE_FALSE)
00718 { // error already recorded
00719 return GE_FALSE;
00720 }
00721 if (geBody_AddSkinVertex(B,Vertex3,U3,V3,(geBody_Index)BoneIndex3,&(F.VtxIndex[2]))==GE_FALSE)
00722 { // error already recorded
00723 return GE_FALSE;
00724 }
00725
00726 if (geBody_AddNormal( B, Normal1, (geBody_Index)BoneIndex1, &(F.NormalIndex[0]) ) == GE_FALSE)
00727 { // error already recorded
00728 return GE_FALSE;
00729 }
00730 if (geBody_AddNormal( B, Normal2, (geBody_Index)BoneIndex2, &(F.NormalIndex[1]) ) == GE_FALSE)
00731 { // error already recorded
00732 return GE_FALSE;
00733 }
00734 if (geBody_AddNormal( B, Normal3, (geBody_Index)BoneIndex3, &(F.NormalIndex[2]) ) == GE_FALSE)
00735 { // error already recorded
00736 return GE_FALSE;
00737 }
00738
00739 F.MaterialIndex = (geBody_Index)MaterialIndex;
00740 if (geBody_AddToFaces( B, &F, GE_BODY_HIGHEST_LOD ) == GE_FALSE)
00741 { // error already recorded
00742 return GE_FALSE;
00743 }
00744
00745 geBody_SortSkinVertices(B);
00746
00747 return GE_TRUE;
00748
00749 }
|
|
||||||||||||||||||||||||||||||||
|
Definition at line 752 of file body.c. References B, geBody_Material::Bitmap, geBody_Material::Blue, Blue, ERR_BODY_ENOMEM, GE_FALSE, GE_RAM_REALLOC_ARRAY, GE_TRUE, geBitmap_CreateRef(), geBody_IsValid(), geBoolean, geErrorLog_Add, geErrorLog_AddString, GENESISCC, geStrBlock_Append(), geStrBlock_FindString(), geBody_Material::Green, Green, NULL, geBody_Material::Red, and Red.
00757 {
00758 int FoundIndex;
00759 geBody_Material *NewMaterial;
00760 assert( B != NULL );
00761 assert( MaterialIndex != NULL );
00762 assert( geBody_IsValid(B) != GE_FALSE );
00763 assert( B->MaterialCount >= 0 );
00764
00765 if (MaterialName == NULL)
00766 {
00767 geErrorLog_AddString(-1,"Can't add material - name can not be NULL", NULL);
00768 return GE_FALSE;
00769 }
00770 if (MaterialName[0] == 0)
00771 {
00772 geErrorLog_AddString(-1,"Can't add material - name must have > 0 length", NULL);
00773 return GE_FALSE;
00774 }
00775 if (geStrBlock_FindString(B->MaterialNames, MaterialName, &FoundIndex) == GE_TRUE)
00776 {
00777 geErrorLog_AddString(-1,"Can't add material - name already used", NULL);
00778 return GE_FALSE;
00779 }
00780
00781
00782 NewMaterial = GE_RAM_REALLOC_ARRAY( B->MaterialArray,
00783 geBody_Material,(B->MaterialCount+1) );
00784 if ( NewMaterial == NULL )
00785 {
00786 geErrorLog_Add(ERR_BODY_ENOMEM, NULL);
00787 return GE_FALSE;
00788 }
00789
00790
00791 B->MaterialArray = NewMaterial;
00792 if (geStrBlock_Append(&(B->MaterialNames),MaterialName) == GE_FALSE)
00793 {
00794 geErrorLog_Add(ERR_BODY_ENOMEM, NULL);
00795 return GE_FALSE;
00796 }
00797
00798 {
00799 geBody_Material *M = &(B->MaterialArray[B->MaterialCount]);
00800 M->Bitmap = Bitmap;
00801 if (Bitmap != NULL)
00802 geBitmap_CreateRef(Bitmap);
00803 M->Red = Red;
00804 M->Green = Green;
00805 M->Blue = Blue;
00806
00807 }
00808 *MaterialIndex = B->MaterialCount;
00809 B->MaterialCount ++;
00810 return GE_TRUE;
00811 }
|
|
||||||||||||||||||||
|
Definition at line 587 of file body.c. References B, ERR_BODY_ENOMEM, GE_BODY_HIGHEST_LOD_MASK, GE_BODY_TOLERANCE, GE_FALSE, GE_RAM_REALLOC_ARRAY, GE_TRUE, geBody_Index, geBody_IsValid(), geBoolean, geErrorLog_Add, GENESISCC, geVec3d_Compare(), geVec3d_Normalize(), and NULL. Referenced by geBody_AddFace().
00591 {
00592 geBody_Normal *NewNormalArray;
00593 geBody_Normal *N;
00594 geVec3d NNorm;
00595 int i;
00596
00597 assert( B != NULL );
00598 assert( Normal != NULL );
00599 assert( Index != NULL );
00600 assert( geBody_IsValid(B) != GE_FALSE );
00601
00602 assert( B->SkinNormalCount+1 > 0 );
00603 NNorm = *Normal;
00604 geVec3d_Normalize(&NNorm);
00605 // see if new normal is alreay in SkinNormalArray
00606 for (i=0, N = B->SkinNormalArray; i<B->SkinNormalCount; i++,N++)
00607 {
00608 if (N->BoneIndex == BoneIndex)
00609 {
00610 if ( geVec3d_Compare( &(N->Normal),&NNorm,GE_BODY_TOLERANCE ) == GE_TRUE )
00611 {
00612 *Index = (geBody_Index)i;
00613 return GE_TRUE;
00614 }
00615 }
00616 }
00617
00618 // new normal needs to be added to SkinNormalArray
00619 NewNormalArray = GE_RAM_REALLOC_ARRAY( B->SkinNormalArray,
00620 geBody_Normal,(B->SkinNormalCount+1));
00621 if (NewNormalArray == NULL)
00622 {
00623 geErrorLog_Add(ERR_BODY_ENOMEM, NULL);
00624 return GE_FALSE;
00625 }
00626 B->SkinNormalArray = NewNormalArray;
00627 B->SkinNormalArray[ B->SkinNormalCount ].Normal = NNorm;
00628 B->SkinNormalArray[ B->SkinNormalCount ].BoneIndex = BoneIndex;
00629 B->SkinNormalArray[ B->SkinNormalCount ].LevelOfDetailMask = GE_BODY_HIGHEST_LOD_MASK;
00630 *Index = B->SkinNormalCount;
00631 B->SkinNormalCount ++ ;
00632 return GE_TRUE;
00633 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 523 of file body.c. References B, geBody_XSkinVertex::BoneIndex, geBody_Bone::BoundingBoxMax, geBody_Bone::BoundingBoxMin, ERR_BODY_ENOMEM, GE_BODY_HIGHEST_LOD_MASK, GE_FALSE, GE_RAM_REALLOC_ARRAY, GE_TRUE, geBody_Index, geBody_IsValid(), geBody_XSkinVertexCompare(), geBoolean, geErrorLog_Add, GENESISCC, geBody_XSkinVertex::LevelOfDetailMask, MAX, MIN, NULL, U, V, geVec3d::X, geBody_XSkinVertex::XPoint, geBody_XSkinVertex::XU, geBody_XSkinVertex::XV, geVec3d::Y, and geVec3d::Z. Referenced by geBody_AddFace().
00528 {
00529 geBody_Bone *Bone;
00530 geBody_XSkinVertex *SV;
00531 geBody_XSkinVertex NewSV;
00532 int i;
00533 assert( B != NULL );
00534 assert( Vertex != NULL );
00535 assert( Index != NULL );
00536 assert( geBody_IsValid(B) != GE_FALSE );
00537
00538 assert( B->XSkinVertexCount+1 > 0 );
00539
00540 NewSV.XPoint = *Vertex;
00541 NewSV.XU = U;
00542 NewSV.XV = V;
00543 NewSV.LevelOfDetailMask = GE_BODY_HIGHEST_LOD_MASK;
00544 NewSV.BoneIndex = BoneIndex;
00545
00546 assert( B->BoneCount > BoneIndex );
00547 Bone = &(B->BoneArray[BoneIndex]);
00548
00549
00550 // see if new Vertex is alreay in XSkinVertexArray
00551 for (i=0; i<B->XSkinVertexCount; i++)
00552 {
00553 SV = &(B->XSkinVertexArray[i]);
00554 if (SV->BoneIndex == BoneIndex)
00555 {
00556 if (geBody_XSkinVertexCompare(SV,&NewSV) == GE_TRUE )
00557 {
00558 *Index = (geBody_Index)i;
00559 return GE_TRUE;
00560 }
00561 }
00562 }
00563 // new Vertex needs to be added to XSkinVertexArray
00564 SV = GE_RAM_REALLOC_ARRAY( B->XSkinVertexArray ,
00565 geBody_XSkinVertex, (B->XSkinVertexCount + 1) );
00566 if ( SV == NULL )
00567 {
00568 geErrorLog_Add(ERR_BODY_ENOMEM, NULL);
00569 return GE_FALSE;
00570 }
00571 B->XSkinVertexArray = SV;
00572
00573 B->XSkinVertexArray[B->XSkinVertexCount] = NewSV;
00574 *Index = B->XSkinVertexCount;
00575
00576 Bone->BoundingBoxMin.X = MIN(Bone->BoundingBoxMin.X,NewSV.XPoint.X);
00577 Bone->BoundingBoxMin.Y = MIN(Bone->BoundingBoxMin.Y,NewSV.XPoint.Y);
00578 Bone->BoundingBoxMin.Z = MIN(Bone->BoundingBoxMin.Z,NewSV.XPoint.Z);
00579 Bone->BoundingBoxMax.X = MAX(Bone->BoundingBoxMax.X,NewSV.XPoint.X);
00580 Bone->BoundingBoxMax.Y = MAX(Bone->BoundingBoxMax.Y,NewSV.XPoint.Y);
00581 Bone->BoundingBoxMax.Z = MAX(Bone->BoundingBoxMax.Z,NewSV.XPoint.Z);
00582
00583 B->XSkinVertexCount ++ ;
00584 return GE_TRUE;
00585 }
|
|
||||||||||||||||
|
Definition at line 635 of file body.c. References B, ERR_BODY_ENOMEM, geBody_TriangleList::FaceArray, geBody_TriangleList::FaceCount, GE_BODY_NUMBER_OF_LOD, GE_FALSE, GE_RAM_REALLOC_ARRAY, GE_TRUE, geBody_Index, geBody_IsValid(), geBoolean, geErrorLog_Add, GENESISCC, geBody_Triangle::MaterialIndex, and NULL. Referenced by geBody_AddFace().
00636 {
00637 geBody_Triangle *NewFaceArray;
00638 geBody_TriangleList *FL;
00639
00640 assert( B != NULL );
00641 assert( F != NULL );
00642 assert( DetailLevel >= 0);
00643 assert( DetailLevel < GE_BODY_NUMBER_OF_LOD );
00644 assert( geBody_IsValid(B) != GE_FALSE );
00645
00646 FL = &( B->SkinFaces[DetailLevel] );
00647
00648 assert( F->MaterialIndex >= 0 );
00649 assert( F->MaterialIndex < B->MaterialCount );
00650
00651 NewFaceArray = GE_RAM_REALLOC_ARRAY( FL->FaceArray,
00652 geBody_Triangle,(FL->FaceCount+1) );
00653 if ( NewFaceArray == NULL )
00654 {
00655 geErrorLog_Add(ERR_BODY_ENOMEM, NULL);
00656 return GE_FALSE;
00657 }
00658
00659 FL->FaceArray = NewFaceArray;
00660
00661 {
00662 int i;
00663 // insertion sort new face into FaceArray keyed on MaterialIndex
00664 geBody_Index MaterialIndex = F->MaterialIndex;
00665 for (i=FL->FaceCount; i>=1; i--)
00666 {
00667 if (FL->FaceArray[i-1].MaterialIndex <= MaterialIndex)
00668 break;
00669 FL->FaceArray[i] = FL->FaceArray[i-1];
00670 }
00671
00672 FL->FaceArray[i] = *F;
00673 }
00674 FL->FaceCount ++;
00675
00676 return GE_TRUE;
00677 }
|
|
||||||||||||||||
|
Definition at line 465 of file body.c. References B, GE_BODY_NUMBER_OF_LOD, geBody_Index, GENESISCC, and NULL.
00467 {
00468 int i,j,lod;
00469 geBody_Index Count;
00470 geBody_Triangle *T;
00471
00472 assert( B!=NULL );
00473 for (lod = 0; lod< GE_BODY_NUMBER_OF_LOD; lod++)
00474 {
00475 Count = B->SkinFaces[lod].FaceCount;
00476 for (i=0,T=B->SkinFaces[lod].FaceArray;
00477 i<Count;
00478 i++,T++)
00479 {
00480 for (j=0; j<3; j++)
00481 {
00482 if (T->VtxIndex[j] == Index1)
00483 {
00484 T->VtxIndex[j] = Index2;
00485 }
00486 }
00487 }
00488 }
00489 }
|
|
||||||||||||
|
Definition at line 906 of file body.c. References B, GE_BODY_HIGHEST_LOD_MASK, GE_BODY_NUMBER_OF_LOD, GE_FALSE, GE_TRUE, geBody_IsValid(), geBoolean, GENESISCC, and NULL.
00907 {
00908 assert( B != NULL);
00909 assert( Levels >= 0 );
00910 assert( Levels < GE_BODY_NUMBER_OF_LOD );
00911 assert( geBody_IsValid(B) != GE_FALSE );
00912 #pragma message ("LOD code goes here:")
00913 B->LevelsOfDetail = GE_BODY_HIGHEST_LOD_MASK; // Levels
00914 Levels;
00915 return GE_TRUE;
00916 }
|
|
|
Definition at line 225 of file body.c. References B, ERR_BODY_ENOMEM, GE_FALSE, geBody_CreateNull(), geBody_DestroyPossiblyIncompleteBody(), geBody_SanityCheck(), geErrorLog_Add, GENESISCC, geStrBlock_Create(), and NULL.
00226 {
00227 geBody *B;
00228
00229 B = geBody_CreateNull();
00230 if ( B == NULL)
00231 {
00232 geErrorLog_Add(ERR_BODY_ENOMEM, NULL);
00233 return NULL;
00234 }
00235
00236 B->BoneNames = geStrBlock_Create();
00237 if (B->BoneNames == NULL)
00238 {
00239 geErrorLog_Add(ERR_BODY_ENOMEM, NULL);
00240 geBody_DestroyPossiblyIncompleteBody(&B);
00241 return NULL;
00242 }
00243 B->MaterialNames = geStrBlock_Create();
00244
00245 if (B->MaterialNames == NULL)
00246 {
00247 geErrorLog_Add(ERR_BODY_ENOMEM, NULL);
00248 geBody_DestroyPossiblyIncompleteBody(&B);
00249 return NULL;
00250 }
00251
00252 assert( geBody_SanityCheck(B) != GE_FALSE );
00253 return B;
00254 }
|
|
|
Definition at line 1052 of file body.c. References B, geBody_Material::Bitmap, ERR_BODY_ENOMEM, ERR_BODY_FILE_READ, GE_BODY_BITMAP_DIRECTORY_NAME, GE_BODY_GEOMETRY_NAME, GE_FALSE, GE_VFILE_OPEN_DIRECTORY, GE_VFILE_OPEN_READONLY, GE_VFILE_TYPE_VIRTUAL, geBitmap_CreateFromFile(), geBitmap_SetMipCount(), geBody_CreateNull(), geBody_DestroyPossiblyIncompleteBody(), geBody_ReadGeometry(), geErrorLog_Add, GENESISCC, geVFile_Close(), geVFile_Open(), geVFile_OpenNewSystem(), and NULL. Referenced by geActor_DefCreateFromFile().
01053 {
01054 geBody *B;
01055 int i;
01056
01057 geVFile *VFile;
01058 geVFile *SubFile=NULL;
01059 geVFile *BitmapDirectory=NULL;
01060
01061 assert( pFile != NULL );
01062
01063 VFile = geVFile_OpenNewSystem(pFile,GE_VFILE_TYPE_VIRTUAL, NULL,
01064 NULL, GE_VFILE_OPEN_DIRECTORY | GE_VFILE_OPEN_READONLY);
01065 if (VFile == NULL)
01066 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); goto CreateError;}
01067
01068 SubFile = geVFile_Open(VFile,GE_BODY_GEOMETRY_NAME,GE_VFILE_OPEN_READONLY);
01069 if (SubFile == NULL)
01070 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); goto CreateError;}
01071
01072 B = geBody_CreateNull();
01073 if (B==NULL)
01074 { geErrorLog_Add( ERR_BODY_ENOMEM , NULL); goto CreateError; }
01075
01076 if (geBody_ReadGeometry(B,SubFile)==GE_FALSE)
01077 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); goto CreateError;}
01078 geVFile_Close(SubFile);
01079
01080 BitmapDirectory = geVFile_Open(VFile,GE_BODY_BITMAP_DIRECTORY_NAME,
01081 GE_VFILE_OPEN_DIRECTORY | GE_VFILE_OPEN_READONLY);
01082 if (BitmapDirectory == NULL)
01083 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); goto CreateError;}
01084
01085 for (i=0; i<B->MaterialCount; i++)
01086 {
01087 geBody_Material *M;
01088 M = &(B->MaterialArray[i]);
01089
01090 if (M->Bitmap != NULL)
01091 {
01092 char FName[1000];
01093 sprintf(FName,"%d",i);
01094
01095 SubFile = geVFile_Open(BitmapDirectory,FName,GE_VFILE_OPEN_READONLY);
01096 if (SubFile == NULL)
01097 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); goto CreateError;}
01098
01099 M->Bitmap = geBitmap_CreateFromFile(SubFile);
01100
01101 if (M->Bitmap == NULL)
01102 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); goto CreateError;}
01103
01104 #if 1
01105 // Set the number of mips to 4
01106 if (!geBitmap_SetMipCount(M->Bitmap, 4))
01107 {
01108 geErrorLog_Add( ERR_BODY_FILE_READ , NULL);
01109 goto CreateError;
01110 }
01111 #endif
01112
01113 geVFile_Close(SubFile);
01114 }
01115 }
01116 geVFile_Close(BitmapDirectory);
01117 geVFile_Close(VFile);
01118 return B;
01119
01120 CreateError:
01121 geBody_DestroyPossiblyIncompleteBody(&B);
01122 if (SubFile != NULL)
01123 geVFile_Close(SubFile);
01124 if (BitmapDirectory != NULL)
01125 geVFile_Close(BitmapDirectory);
01126 if (VFile != NULL)
01127 geVFile_Close(VFile);
01128 return NULL;
01129 }
|
|
|
Definition at line 128 of file body.c. References B, ERR_BODY_ENOMEM, GE_BODY_NUMBER_OF_LOD, GE_RAM_ALLOCATE_STRUCT, geErrorLog_Add, GENESISCC, geVec3d_Set(), and NULL. Referenced by geBody_Create(), and geBody_CreateFromFile().
00129 {
00130 geBody *B;
00131 int i;
00132
00133 B = GE_RAM_ALLOCATE_STRUCT(geBody);
00134 if ( B == NULL)
00135 {
00136 geErrorLog_Add(ERR_BODY_ENOMEM, NULL);
00137 return NULL;
00138 }
00139 B->IsValid = NULL;
00140 B->XSkinVertexCount = 0;
00141 B->XSkinVertexArray = NULL;
00142
00143 B->SkinNormalCount = 0;
00144 B->SkinNormalArray = NULL;
00145
00146 B->BoneCount = 0;
00147 B->BoneArray = NULL;
00148 B->BoneNames = NULL;
00149
00150 B->MaterialCount = 0;
00151 B->MaterialArray = NULL;
00152 B->MaterialNames = NULL;
00153 for (i=0; i<GE_BODY_NUMBER_OF_LOD; i++)
00154 {
00155 B->SkinFaces[i].FaceCount = 0;
00156 B->SkinFaces[i].FaceArray = NULL;
00157 }
00158 B->LevelsOfDetail = 1;
00159 B->IsValid = B;
00160
00161 geVec3d_Set(&(B->BoundingBoxMin),0.0f,0.0f,0.0f);
00162 geVec3d_Set(&(B->BoundingBoxMax),0.0f,0.0f,0.0f);
00163 return B;
00164 }
|
|
|
Definition at line 256 of file body.c. References GE_FALSE, geBody_DestroyPossiblyIncompleteBody(), geBody_IsValid(), GENESISCC, and NULL. Referenced by geActor_DefDestroy(), geActor_DestroyDirect(), and geActor_SetBody().
00257 {
00258 assert( PB != NULL );
00259 assert( *PB != NULL );
00260 assert( geBody_IsValid(*PB) != GE_FALSE );
00261 geBody_DestroyPossiblyIncompleteBody( PB );
00262 }
|
|
|
Definition at line 166 of file body.c. References B, GE_BODY_NUMBER_OF_LOD, geBitmap_Destroy(), GENESISCC, geRam_Free, geStrBlock_Destroy(), NULL, and uint32. Referenced by geBody_Create(), geBody_CreateFromFile(), and geBody_Destroy().
00167 {
00168 geBody *B;
00169 int i;
00170
00171 B = *PB;
00172 B->IsValid = NULL;
00173 if (B->XSkinVertexArray != NULL)
00174 {
00175 geRam_Free( B->XSkinVertexArray );
00176 B->XSkinVertexArray = NULL;
00177 }
00178 if (B->SkinNormalArray != NULL)
00179 {
00180 geRam_Free( B->SkinNormalArray );
00181 B->SkinNormalArray = NULL;
00182 }
00183 if (B->BoneNames != NULL)
00184 {
00185 geStrBlock_Destroy(&(B->BoneNames));
00186 B->BoneNames = NULL;
00187 }
00188 if (B->BoneArray != NULL)
00189 {
00190 geRam_Free(B->BoneArray);
00191 B->BoneArray = NULL;
00192 }
00193 if (B->MaterialArray != NULL)
00194 {
00195 for (i=0; i<B->MaterialCount; i++)
00196 {
00197 // <> CB ; see note above
00198 // this doesn't seem to prevent us from crashing here
00199 // when an actor has an error during _Create
00200 if ( (uint32)(B->MaterialArray[i].Bitmap) > 1 )
00201 geBitmap_Destroy(&(B->MaterialArray[i].Bitmap));
00202 B->MaterialArray[i].Bitmap = NULL;
00203 }
00204 geRam_Free( B->MaterialArray );
00205 B->MaterialArray = NULL;
00206 }
00207 if (B->MaterialNames != NULL)
00208 {
00209 geStrBlock_Destroy(&(B->MaterialNames));
00210 B->MaterialNames = NULL;
00211 }
00212
00213 for (i=0; i<GE_BODY_NUMBER_OF_LOD; i++)
00214 {
00215 if (B->SkinFaces[i].FaceArray != NULL)
00216 {
00217 geRam_Free(B->SkinFaces[i].FaceArray);
00218 B->SkinFaces[i].FaceArray = NULL;
00219 }
00220 }
00221 geRam_Free(*PB);
00222 *PB = NULL;
00223 }
|
|
||||||||||||||||||||||||
|
Definition at line 284 of file body.c. References B, GE_FALSE, geBody_IsValid(), GENESISCC, geStrBlock_GetString(), and NULL. Referenced by geActor_AnimationStepBoneOptimized(), geActor_AnimationTestStepBoneOptimized(), geActor_Create(), and geActor_GetLightingOptions().
00289 {
00290 assert( B != NULL );
00291 assert( geBody_IsValid(B) != GE_FALSE );
00292 assert( Attachment != NULL );
00293 assert( ParentBoneIndex != NULL );
00294 assert( BoneName != NULL );
00295
00296 assert( BoneIndex >=0 );
00297 assert( BoneIndex < B->BoneCount );
00298 *Attachment = B->BoneArray[BoneIndex].AttachmentMatrix;
00299 *ParentBoneIndex = B->BoneArray[BoneIndex].ParentBoneIndex;
00300 *BoneName = geStrBlock_GetString(B->BoneNames,BoneIndex);
00301 }
|
|
||||||||||||||||||||||||
|
Definition at line 371 of file body.c. References B, GE_FALSE, GE_TRUE, geBody_IsValid(), geBoolean, GENESISCC, geStrBlock_FindString(), and NULL. Referenced by geActor_DefHasBoneNamed(), and geActor_GetBoneIndex().
00376 {
00377 assert( B != NULL );
00378 assert( geBody_IsValid(B) != GE_FALSE );
00379 assert( Attachment != NULL );
00380 assert( pParentBoneIndex != NULL );
00381 assert( pBoneIndex != NULL );
00382 assert( BoneName != NULL );
00383
00384 if(geStrBlock_FindString(B->BoneNames, BoneName, pBoneIndex) == GE_TRUE)
00385 {
00386 *Attachment = B->BoneArray[*pBoneIndex].AttachmentMatrix;
00387 *pParentBoneIndex = B->BoneArray[*pBoneIndex].ParentBoneIndex;
00388
00389 return GE_TRUE;
00390 }
00391
00392 return GE_FALSE;
00393 }
|
|
|
Definition at line 277 of file body.c. References B, GE_FALSE, geBody_IsValid(), GENESISCC, and NULL. Referenced by geActor_Create(), geActor_GetBoneCount(), geActor_GetDynamicExtBox(), and geActor_GetLightingOptions().
00278 {
00279 assert( B != NULL );
00280 assert( geBody_IsValid(B) != GE_FALSE );
00281 return B->BoneCount;
00282 }
|
|
|
Definition at line 303 of file body.c. References B, GE_FALSE, geBody_IsValid(), GENESISCC, geStrBlock_GetChecksum(), int32, and NULL.
00304 {
00305 assert( geBody_IsValid(B) != GE_FALSE );
00306
00307 if (B->BoneNames != NULL)
00308 {
00309 return geStrBlock_GetChecksum( B->BoneNames );
00310 }
00311 else
00312 return 0;
00313 }
|
|
||||||||||||||||||||
|
Definition at line 316 of file body.c. References B, geBody_Bone::BoundingBoxMax, geBody_Bone::BoundingBoxMin, GE_BODY_ROOT, GE_FALSE, GE_TRUE, geBoolean, GENESISCC, NULL, and geVec3d::X. Referenced by geActor_GetBoneBoundingBoxByIndex().
00320 {
00321 assert( B != NULL);
00322 assert( MinimumBoxCorner != NULL );
00323 assert( MaximumBoxCorner != NULL );
00324 assert( (BoneIndex >=0) || (BoneIndex == GE_BODY_ROOT));
00325 assert( (BoneIndex < B->BoneCount) || (BoneIndex == GE_BODY_ROOT));
00326 if (BoneIndex == GE_BODY_ROOT)
00327 {
00328 #pragma message ("discontinue this?")
00329 *MinimumBoxCorner = B->BoundingBoxMin;
00330 *MaximumBoxCorner = B->BoundingBoxMax;
00331 }
00332 else
00333 {
00334 geBody_Bone *Bone = &(B->BoneArray[BoneIndex]);
00335
00336 if (Bone->BoundingBoxMin.X > Bone->BoundingBoxMax.X)
00337 {
00338 return GE_FALSE;
00339 }
00340 *MinimumBoxCorner = Bone->BoundingBoxMin;
00341 *MaximumBoxCorner = Bone->BoundingBoxMax;
00342 }
00343 return GE_TRUE;
00344 }
|
|
||||||||||||||||||||||||
|
Definition at line 265 of file body.c. References B, GE_BODY_NUMBER_OF_LOD, GE_TRUE, geBody_IsValid(), geBoolean, and GENESISCC.
00266 {
00267 assert( geBody_IsValid(B) == GE_TRUE );
00268 assert( ( lod >=0 ) && ( lod < GE_BODY_NUMBER_OF_LOD ) );
00269 *Vertices = B->XSkinVertexCount;
00270 *Faces = B->SkinFaces[lod].FaceCount;
00271 *Normals = B->SkinNormalCount;
00272 return GE_TRUE;
00273 }
|
|
||||||||||||||||||||||||||||||||
|
Definition at line 813 of file body.c. References B, geBody_Material::Bitmap, Blue, geBody_Material::Blue, GE_FALSE, GE_TRUE, geBody_IsValid(), geBoolean, GENESISCC, geStrBlock_GetString(), Green, geBody_Material::Green, NULL, Red, and geBody_Material::Red. Referenced by gePuppet_FetchTextures().
00816 {
00817 assert( B != NULL );
00818 assert( geBody_IsValid(B) != GE_FALSE );
00819 assert( Red != NULL );
00820 assert( Green != NULL );
00821 assert( Blue != NULL );
00822 assert( Bitmap != NULL );
00823 assert( MaterialIndex >= 0 );
00824 assert( MaterialIndex < B->MaterialCount );
00825 assert( MaterialName != NULL );
00826 *MaterialName = geStrBlock_GetString(B->MaterialNames,MaterialIndex);
00827
00828 {
00829 geBody_Material *M = &(B->MaterialArray[MaterialIndex]);
00830 *Bitmap = M->Bitmap;
00831 *Red = M->Red;
00832 *Green = M->Green;
00833 *Blue = M->Blue;
00834 }
00835 return GE_TRUE;
00836 }
|
|
|
Definition at line 395 of file body.c. References B, GE_FALSE, geBody_IsValid(), GENESISCC, and NULL. Referenced by gePuppet_FetchTextures().
00396 {
00397 assert( B != NULL );
00398 assert( geBody_IsValid(B) != GE_FALSE );
00399 return B->MaterialCount;
00400 }
|
|
|
||||||||||||
|
Definition at line 931 of file body.c. References B, ERR_BODY_ENOMEM, ERR_BODY_FILE_PARSE, ERR_BODY_FILE_READ, GE_BODY_FILE_TYPE, GE_BODY_FILE_VERSION, GE_BODY_NUMBER_OF_LOD, GE_FALSE, GE_TRUE, geBody_Index, geBody_IsValid(), geBoolean, geErrorLog_Add, GENESISCC, geRam_Allocate, geStrBlock_CreateFromFile(), geVFile_Read(), NULL, and uint32. Referenced by geBody_CreateFromFile().
00932 {
00933 uint32 u;
00934 int i;
00935
00936 assert( B != NULL );
00937 assert( pFile != NULL );
00938 if(geVFile_Read(pFile, &u, sizeof(u)) == GE_FALSE)
00939 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
00940 if (u!=GE_BODY_FILE_TYPE)
00941 { geErrorLog_Add( ERR_BODY_FILE_PARSE , NULL); return GE_FALSE; }
00942
00943
00944 if(geVFile_Read(pFile, &u, sizeof(u)) == GE_FALSE)
00945 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
00946 if (u!=GE_BODY_FILE_VERSION)
00947 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
00948
00949
00950 if(geVFile_Read(pFile, &(B->BoundingBoxMin), sizeof(B->BoundingBoxMin)) == GE_FALSE)
00951 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
00952
00953 if(geVFile_Read(pFile, &(B->BoundingBoxMax), sizeof(B->BoundingBoxMax)) == GE_FALSE)
00954 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
00955
00956 if(geVFile_Read(pFile, &(B->XSkinVertexCount), sizeof(B->XSkinVertexCount)) == GE_FALSE)
00957 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
00958
00959 if (B->XSkinVertexCount>0)
00960 {
00961 u = sizeof(geBody_XSkinVertex) * B->XSkinVertexCount;
00962 B->XSkinVertexArray = geRam_Allocate(u);
00963 if (B->XSkinVertexArray == NULL)
00964 { geErrorLog_Add( ERR_BODY_ENOMEM , NULL); return GE_FALSE; }
00965 if(geVFile_Read(pFile, B->XSkinVertexArray, u) == GE_FALSE)
00966 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
00967 }
00968
00969 if(geVFile_Read(pFile, &(B->SkinNormalCount), sizeof(B->SkinNormalCount)) == GE_FALSE)
00970 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
00971
00972 if (B->SkinNormalCount>0)
00973 {
00974 u = sizeof(geBody_Normal) * B->SkinNormalCount;
00975 B->SkinNormalArray = geRam_Allocate(u);
00976 if (B->SkinNormalArray == NULL)
00977 { geErrorLog_Add( ERR_BODY_ENOMEM , NULL); return GE_FALSE; }
00978 if(geVFile_Read(pFile, B->SkinNormalArray, u) == GE_FALSE)
00979 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
00980 }
00981
00982 if(geVFile_Read(pFile, &(B->BoneCount), sizeof(B->BoneCount)) == GE_FALSE)
00983 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
00984
00985 if (B->BoneCount>0)
00986 {
00987 u = sizeof(geBody_Bone) * B->BoneCount;
00988 B->BoneArray = geRam_Allocate(u);
00989 if (B->BoneArray == NULL)
00990 { geErrorLog_Add( ERR_BODY_ENOMEM , NULL); return GE_FALSE; }
00991 if(geVFile_Read(pFile, B->BoneArray, u) == GE_FALSE)
00992 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
00993 }
00994
00995 B->BoneNames = geStrBlock_CreateFromFile(pFile);
00996 if (B->BoneNames==NULL)
00997 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
00998
00999 if(geVFile_Read(pFile, &(B->MaterialCount), sizeof(B->MaterialCount)) == GE_FALSE)
01000 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
01001
01002 if (B->MaterialCount>0)
01003 {
01004 u = sizeof(geBody_Material) * B->MaterialCount;
01005 B->MaterialArray = geRam_Allocate(u);
01006 if (B->MaterialArray == NULL)
01007 { geErrorLog_Add( ERR_BODY_ENOMEM , NULL); return GE_FALSE; }
01008 if(geVFile_Read(pFile, B->MaterialArray, u) == GE_FALSE)
01009 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
01010
01011 // CB added this nastiness because it seems the Bitmap pointer is
01012 // read in with the Material array, and is later used as a boolean
01013 // for "should this material have a texture"
01014 for(u=0;u<(uint32)B->MaterialCount;u++)
01015 {
01016 if ( B->MaterialArray[u].Bitmap )
01017 B->MaterialArray[u].Bitmap = (geBitmap *)1;
01018 }
01019 }
01020
01021 B->MaterialNames = geStrBlock_CreateFromFile(pFile);
01022 if ( B->MaterialNames == NULL )
01023 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
01024
01025 if(geVFile_Read(pFile, &(B->LevelsOfDetail), sizeof(B->LevelsOfDetail)) == GE_FALSE)
01026 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
01027
01028 if (B->LevelsOfDetail > GE_BODY_NUMBER_OF_LOD)
01029 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
01030
01031 for (i=0; i<B->LevelsOfDetail; i++)
01032 {
01033 if(geVFile_Read(pFile, &(u), sizeof(u)) == GE_FALSE)
01034 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
01035 B->SkinFaces[i].FaceCount = (geBody_Index)u;
01036
01037 if (u>0)
01038 {
01039 u = sizeof(geBody_Triangle) * u;
01040 B->SkinFaces[i].FaceArray = geRam_Allocate(u);
01041 if (B->SkinFaces[i].FaceArray == NULL)
01042 { geErrorLog_Add( ERR_BODY_ENOMEM , NULL); return GE_FALSE; }
01043 if(geVFile_Read(pFile, B->SkinFaces[i].FaceArray, u) == GE_FALSE)
01044 { geErrorLog_Add( ERR_BODY_FILE_READ , NULL); return GE_FALSE; }
01045 }
01046 }
01047
01048 assert( geBody_IsValid(B) != GE_FALSE );
01049 return GE_TRUE;
01050 }
|
|
|
Definition at line 40 of file body.c. References B, GE_BODY_NO_PARENT_BONE, GE_FALSE, GE_TRUE, geBoolean, GENESISCC, geStrBlock_GetCount(), and NULL. Referenced by geBody_Create(), and geBody_IsValid().
00041 {
00042 int i,j,k;
00043 int Lod,FaceCount,VertexCount,NormalCount,BoneCount;
00044 geBody_XSkinVertex *SV;
00045 geBody_Bone *Bone;
00046 geBody_Normal *N;
00047
00048 Lod = B->LevelsOfDetail;
00049 VertexCount = B->XSkinVertexCount;
00050 NormalCount = B->SkinNormalCount;
00051 BoneCount = B->BoneCount;
00052
00053 if (B->MaterialNames == NULL )
00054 return GE_FALSE;
00055 if (B->MaterialCount != geStrBlock_GetCount(B->MaterialNames))
00056 return GE_FALSE;
00057
00058 if (B->BoneNames == NULL)
00059 return GE_FALSE;
00060 if (B->BoneCount != geStrBlock_GetCount(B->BoneNames))
00061 return GE_FALSE;
00062
00063 if ((B->XSkinVertexArray == NULL) && (B->XSkinVertexCount>0))
00064 return GE_FALSE;
00065 if ((B->SkinNormalArray == NULL) && (B->SkinNormalCount>0))
00066 return GE_FALSE;
00067 if ((B->BoneArray == NULL) && (B->BoneCount>0))
00068 return GE_FALSE;
00069 if ((B->MaterialArray == NULL) && (B->MaterialCount>0))
00070 return GE_FALSE;
00071
00072
00073 for (i=0; i<Lod; i++)
00074 {
00075 geBody_Triangle *F;
00076 FaceCount = B->SkinFaces[i].FaceCount;
00077 for (j=0,F=B->SkinFaces[i].FaceArray; j<FaceCount; j++,F++)
00078 {
00079 for (k=0; k<3; k++)
00080 {
00081 if ((F->VtxIndex[k] < 0) || (F->VtxIndex[k] >= VertexCount ))
00082 return GE_FALSE;
00083 if ((F->NormalIndex[k] < 0) || (F->NormalIndex[k] >= NormalCount ))
00084 return GE_FALSE;
00085 if ((F->MaterialIndex < 0) || (F->MaterialIndex >= B->MaterialCount))
00086 return GE_FALSE;
00087 }
00088 }
00089 }
00090 for (i=0,SV = B->XSkinVertexArray; i<VertexCount; i++,SV++)
00091 {
00092 if ((SV->BoneIndex < 0) || (SV->BoneIndex >= BoneCount))
00093 return GE_FALSE;
00094 }
00095
00096 for (i=0,N = B->SkinNormalArray; i<NormalCount; i++,N++)
00097 {
00098 if ((N->BoneIndex < 0) || (N->BoneIndex >= BoneCount))
00099 return GE_FALSE;
00100 }
00101
00102 for (i=0,Bone = B->BoneArray; i<BoneCount; i++,Bone++)
00103 {
00104 if (Bone->ParentBoneIndex != GE_BODY_NO_PARENT_BONE)
00105 {
00106 if ((Bone->ParentBoneIndex < 0) || (Bone->ParentBoneIndex > i))
00107 return GE_FALSE;
00108 }
00109 }
00110
00111 return GE_TRUE;
00112
00113 }
|
|
||||||||||||||||||||
|
Definition at line 346 of file body.c. References B, GE_BODY_ROOT, GENESISCC, and NULL. Referenced by geActor_RenderPrep().
00350 {
00351 assert( B != NULL);
00352 assert( MinimumBoxCorner != NULL );
00353 assert( MaximumBoxCorner != NULL );
00354 assert( (BoneIndex >=0) || (BoneIndex == GE_BODY_ROOT));
00355 assert( (BoneIndex < B->BoneCount) || (BoneIndex == GE_BODY_ROOT));
00356 if (BoneIndex == GE_BODY_ROOT)
00357 {
00358 B->BoundingBoxMin = *MinimumBoxCorner;
00359 B->BoundingBoxMax = *MaximumBoxCorner;
00360 }
00361 else
00362 {
00363 B->BoneArray[BoneIndex].BoundingBoxMin = *MinimumBoxCorner;
00364 B->BoneArray[BoneIndex].BoundingBoxMax = *MaximumBoxCorner;
00365 }
00366 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 838 of file body.c. References B, geBody_Material::Bitmap, geBody_Material::Blue, Blue, GE_FALSE, GE_TRUE, geBitmap_CreateRef(), geBody_IsValid(), geBoolean, GENESISCC, geBody_Material::Green, Green, NULL, geBody_Material::Red, and Red.
00840 {
00841 assert( geBody_IsValid(B) != GE_FALSE );
00842 assert( MaterialIndex >= 0 );
00843 assert( MaterialIndex < B->MaterialCount );
00844 {
00845 geBody_Material *M = &(B->MaterialArray[MaterialIndex]);
00846 M->Bitmap = Bitmap;
00847 if (Bitmap != NULL)
00848 geBitmap_CreateRef(Bitmap);
00849 M->Red = Red;
00850 M->Green = Green;
00851 M->Blue = Blue;
00852 }
00853 return GE_TRUE;
00854 }
|
|
|
Definition at line 491 of file body.c. References B, GE_FALSE, GE_TRUE, geBody_Index, geBody_SwapVertexIndices(), geBoolean, GENESISCC, and NULL. Referenced by geBody_AddFace().
00492 {
00493 int i,j;
00494 int Count;
00495 geBoolean AnyChanges = GE_FALSE;
00496 assert( B != NULL );
00497
00498 Count = B->XSkinVertexCount;
00499 for (i=0; i<Count; i++)
00500 {
00501 for (j=0; j<Count-1; j++)
00502 {
00503 if (B->XSkinVertexArray[j].BoneIndex > B->XSkinVertexArray[j+1].BoneIndex)
00504 {
00505 geBody_XSkinVertex Swap;
00506
00507 Swap= B->XSkinVertexArray[j];
00508 B->XSkinVertexArray[j] = B->XSkinVertexArray[j+1];
00509 B->XSkinVertexArray[j+1] = Swap;
00510 geBody_SwapVertexIndices(B,(geBody_Index)j,(geBody_Index)(j+1));
00511 AnyChanges = GE_TRUE;
00512 }
00513 }
00514 if (AnyChanges != GE_TRUE)
00515 {
00516 break;
00517 }
00518 AnyChanges = GE_FALSE;
00519 }
00520 }
|
|
||||||||||||||||
|
Definition at line 432 of file body.c. References B, GE_BODY_NUMBER_OF_LOD, geBody_Index, GENESISCC, and NULL. Referenced by geBody_SortSkinVertices().
00434 {
00435 int i,j,lod;
00436 geBody_Index Count;
00437 geBody_Triangle *T;
00438
00439 assert( B!=NULL );
00440 for (lod = 0; lod< GE_BODY_NUMBER_OF_LOD; lod++)
00441 {
00442 Count = B->SkinFaces[lod].FaceCount;
00443 for (i=0,T=B->SkinFaces[lod].FaceArray;
00444 i<Count;
00445 i++,T++)
00446 {
00447 for (j=0; j<3; j++)
00448 {
00449 if (T->VtxIndex[j] == Index1)
00450 {
00451 T->VtxIndex[j] = Index2;
00452 }
00453 else
00454 {
00455 if (T->VtxIndex[j] == Index2)
00456 {
00457 T->VtxIndex[j] = Index1;
00458 }
00459 }
00460 }
00461 }
00462 }
00463 }
|
|
||||||||||||
|
Definition at line 1133 of file body.c. References B, ERR_BODY_FILE_WRITE, GE_BODY_FILE_TYPE, GE_BODY_FILE_VERSION, GE_FALSE, GE_TRUE, geBody_IsValid(), geBoolean, geErrorLog_Add, GENESISCC, geStrBlock_WriteToBinaryFile(), geVFile_Write(), NULL, and uint32. Referenced by geBody_WriteToFile().
01134 {
01135 uint32 u;
01136 int i;
01137
01138 assert( B != NULL );
01139 assert( pFile != NULL );
01140 assert( geBody_IsValid(B) != GE_FALSE );
01141
01142 // Write the format flag
01143 u = GE_BODY_FILE_TYPE;
01144 if(geVFile_Write(pFile, &u, sizeof(u)) == GE_FALSE)
01145 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); return GE_FALSE; }
01146
01147 // Write the version
01148 u = GE_BODY_FILE_VERSION;
01149 if(geVFile_Write(pFile, &u, sizeof(u)) == GE_FALSE)
01150 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); return GE_FALSE; }
01151
01152 if(geVFile_Write(pFile, &(B->BoundingBoxMin), sizeof(B->BoundingBoxMin)) == GE_FALSE)
01153 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); return GE_FALSE; }
01154
01155 if(geVFile_Write(pFile, &(B->BoundingBoxMax), sizeof(B->BoundingBoxMax)) == GE_FALSE)
01156 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); return GE_FALSE; }
01157
01158 if(geVFile_Write(pFile, &(B->XSkinVertexCount), sizeof(B->XSkinVertexCount)) == GE_FALSE)
01159 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); return GE_FALSE; }
01160
01161 assert( (B->XSkinVertexCount==0) || (B->XSkinVertexArray!=NULL));
01162
01163 if (B->XSkinVertexCount>0)
01164 {
01165 u = sizeof(geBody_XSkinVertex) * B->XSkinVertexCount;
01166 if(geVFile_Write(pFile, B->XSkinVertexArray, u) == GE_FALSE)
01167 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); return GE_FALSE; }
01168 }
01169
01170 if(geVFile_Write(pFile, &(B->SkinNormalCount), sizeof(B->SkinNormalCount)) == GE_FALSE)
01171 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); return GE_FALSE; }
01172
01173 if (B->SkinNormalCount>0)
01174 {
01175 u = sizeof(geBody_Normal) * B->SkinNormalCount;
01176 if(geVFile_Write(pFile, B->SkinNormalArray, u) == GE_FALSE)
01177 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); return GE_FALSE; }
01178 }
01179
01180 if(geVFile_Write(pFile, &(B->BoneCount), sizeof(B->BoneCount)) == GE_FALSE)
01181 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); return GE_FALSE; }
01182
01183 if (B->BoneCount>0)
01184 {
01185 u = sizeof(geBody_Bone) * B->BoneCount;
01186 if(geVFile_Write(pFile, B->BoneArray, u) == GE_FALSE)
01187 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); return GE_FALSE; }
01188 }
01189
01190 if (geStrBlock_WriteToBinaryFile(B->BoneNames,pFile)==GE_FALSE)
01191 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); return GE_FALSE; }
01192
01193 if(geVFile_Write(pFile, &(B->MaterialCount), sizeof(B->MaterialCount)) == GE_FALSE)
01194 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); return GE_FALSE; }
01195
01196 if (B->MaterialCount>0)
01197 {
01198 u = sizeof(geBody_Material) * B->MaterialCount;
01199 if(geVFile_Write(pFile, B->MaterialArray, u) == GE_FALSE)
01200 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); return GE_FALSE; }
01201 }
01202
01203 if (geStrBlock_WriteToBinaryFile(B->MaterialNames,pFile)==GE_FALSE)
01204 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); return GE_FALSE; }
01205
01206 if(geVFile_Write(pFile, &(B->LevelsOfDetail), sizeof(B->LevelsOfDetail)) == GE_FALSE)
01207 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); return GE_FALSE; }
01208
01209 for (i=0; i<B->LevelsOfDetail; i++)
01210 {
01211 u = B->SkinFaces[i].FaceCount;
01212 if(geVFile_Write(pFile, &(u), sizeof(u)) == GE_FALSE)
01213 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); return GE_FALSE; }
01214 if (u>0)
01215 {
01216 u = sizeof(geBody_Triangle) * u;
01217 if(geVFile_Write(pFile, B->SkinFaces[i].FaceArray, u) == GE_FALSE)
01218 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); return GE_FALSE; }
01219 }
01220 }
01221 return GE_TRUE;
01222 }
|
|
||||||||||||
|
Definition at line 1225 of file body.c. References B, geBody_Material::Bitmap, ERR_BODY_FILE_WRITE, GE_BODY_BITMAP_DIRECTORY_NAME, GE_BODY_GEOMETRY_NAME, GE_FALSE, GE_TRUE, GE_VFILE_OPEN_CREATE, GE_VFILE_OPEN_DIRECTORY, GE_VFILE_TYPE_VIRTUAL, geBitmap_WriteToFile(), geBody_IsValid(), geBody_WriteGeometry(), geBoolean, geErrorLog_Add, GENESISCC, geVFile_Close(), geVFile_Open(), geVFile_OpenNewSystem(), and NULL. Referenced by geActor_DefWriteToFile().
01226 {
01227 int i;
01228 geVFile *VFile;
01229 geVFile *SubFile;
01230 geVFile *BitmapDirectory;
01231
01232 assert( geBody_IsValid(B) != GE_FALSE );
01233 assert( pFile != NULL );
01234
01235 VFile = geVFile_OpenNewSystem(pFile,GE_VFILE_TYPE_VIRTUAL, NULL,
01236 NULL, GE_VFILE_OPEN_DIRECTORY | GE_VFILE_OPEN_CREATE);
01237 if (VFile == NULL)
01238 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); goto WriteError;}
01239
01240 SubFile = geVFile_Open(VFile,GE_BODY_GEOMETRY_NAME,GE_VFILE_OPEN_CREATE);
01241 if (SubFile == NULL)
01242 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); goto WriteError;}
01243
01244 if (geBody_WriteGeometry(B,SubFile)==GE_FALSE)
01245 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); goto WriteError;}
01246 if (geVFile_Close(SubFile)==GE_FALSE)
01247 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); goto WriteError;}
01248
01249 BitmapDirectory = geVFile_Open(VFile,GE_BODY_BITMAP_DIRECTORY_NAME,
01250 GE_VFILE_OPEN_DIRECTORY | GE_VFILE_OPEN_CREATE);
01251 if (BitmapDirectory == NULL)
01252 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); goto WriteError;}
01253
01254 for (i=0; i<B->MaterialCount; i++)
01255 {
01256 geBody_Material *M;
01257 M = &(B->MaterialArray[i]);
01258
01259 if (M->Bitmap != NULL)
01260 {
01261 char FName[1000];
01262 sprintf(FName,"%d",i);
01263
01264 SubFile = geVFile_Open(BitmapDirectory,FName,GE_VFILE_OPEN_CREATE);
01265 if (SubFile == NULL)
01266 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); goto WriteError;}
01267
01268 if (geBitmap_WriteToFile(M->Bitmap,SubFile)==GE_FALSE)
01269 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); goto WriteError;}
01270
01271 if (geVFile_Close(SubFile)==GE_FALSE)
01272 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); goto WriteError;}
01273 }
01274 }
01275 if (geVFile_Close(BitmapDirectory)==GE_FALSE)
01276 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); goto WriteError;}
01277 if (geVFile_Close(VFile)==GE_FALSE)
01278 { geErrorLog_Add( ERR_BODY_FILE_WRITE , NULL); goto WriteError;}
01279
01280 return GE_TRUE;
01281 WriteError:
01282 return GE_FALSE;
01283 }
|
|
||||||||||||
|
Definition at line 404 of file body.c. References GE_BODY_TOLERANCE, GE_FALSE, GE_TRUE, geBoolean, GENESISCC, geVec3d_Compare(), NULL, geBody_XSkinVertex::XPoint, geBody_XSkinVertex::XU, and geBody_XSkinVertex::XV. Referenced by geBody_AddSkinVertex().
00407 {
00408 assert( SV1 != NULL );
00409 assert( SV2 != NULL );
00410 if (geVec3d_Compare( &(SV1->XPoint), &(SV2->XPoint),
00411 GE_BODY_TOLERANCE) == GE_FALSE)
00412 {
00413 return GE_FALSE;
00414 }
00415 if (geVec3d_Compare( &(SV1->XPoint), &(SV2->XPoint),
00416 GE_BODY_TOLERANCE) == GE_FALSE)
00417 {
00418 return GE_FALSE;
00419 }
00420 if (fabs(SV1->XU - SV2->XU) > GE_BODY_TOLERANCE)
00421 {
00422 return GE_FALSE;
00423 }
00424 if (fabs(SV1->XV - SV2->XV) > GE_BODY_TOLERANCE)
00425 {
00426 return GE_FALSE;
00427 }
00428 return GE_TRUE;
00429 }
|
1.3.2