📄 model.cpp
字号:
}
}
}
return NULL;
}
//+-----------------------------------------------------------------------------
//| Returns the texture with a specific texture ID
//+-----------------------------------------------------------------------------
MODEL_TEXTURE* MODEL::GetTexture(INT TextureId)
{
INT i;
INT CurrentTextureId = 0;
for(i = 0; i < ModelData.TextureContainer.GetTotalSize(); i++)
{
if(ModelData.TextureContainer.ValidIndex(i))
{
if(CurrentTextureId == TextureId)
{
return ModelData.TextureContainer[i];
}
CurrentTextureId++;
}
}
return NULL;
}
//+-----------------------------------------------------------------------------
//| Creates a default model for texture viewing
//+-----------------------------------------------------------------------------
BOOL MODEL::CreateTextureModel(CONST std::string& TextureFileName, INT Width, INT Height, INT RealWidth, INT RealHeight)
{
FLOAT X;
FLOAT Y;
FLOAT TextureFactorX;
FLOAT TextureFactorY;
MODEL_BONE* Bone;
MODEL_GEOSET* Geoset;
MODEL_TEXTURE* Texture;
MODEL_MATERIAL* Material;
MODEL_MATERIAL_LAYER* Layer;
MODEL_GEOSET_VERTEX* Vertex;
MODEL_GEOSET_FACE* Face;
MODEL_GEOSET_GROUP* Group;
std::vector<INT> MatrixList;
ModelData.Info.Name = "Texture";
ModelData.Info.BlendTime = 150;
Texture = new MODEL_TEXTURE();
if(Texture == NULL)
{
Error.SetMessage("Unable to load \"" + TextureFileName + "\", memory allocation failed!");
return FALSE;
}
Texture->Data().FileName = TextureFileName;
if(!AddTexture(Texture)) return FALSE;
Material = new MODEL_MATERIAL();
if(Material == NULL)
{
Error.SetMessage("Unable to load \"" + TextureFileName + "\", memory allocation failed!");
return FALSE;
}
if(!AddMaterial(Material)) return FALSE;
Layer = new MODEL_MATERIAL_LAYER();
if(Layer == NULL)
{
Error.SetMessage("Unable to load \"" + TextureFileName + "\", memory allocation failed!");
return FALSE;
}
Layer->Data().FilterMode = FILTER_MODE_NONE;
Layer->Data().TextureId = ModelData.TextureContainer.GetLastAddedIndex();
Layer->Data().AnimatedTextureId.SetStaticScalarInt(Layer->Data().TextureId);
Layer->Data().Alpha.SetStaticScalar(1.0f);
Layer->Data().Unshaded = TRUE;
Layer->Data().Unfogged = TRUE;
Layer->Data().TwoSided = TRUE;
if(!Material->AddLayer(Layer)) return FALSE;
Geoset = new MODEL_GEOSET();
if(Geoset == NULL)
{
Error.SetMessage("Unable to load \"" + TextureFileName + "\", memory allocation failed!");
return FALSE;
}
if(!AddGeoset(Geoset)) return FALSE;
Bone = new MODEL_BONE();
if(Bone == NULL)
{
Error.SetMessage("Unable to load \"" + TextureFileName + "\", memory allocation failed!");
return FALSE;
}
Bone->Data().Name = "TextureBone";
if(!AddBone(Bone)) return FALSE;
MatrixList.push_back(0);
Group = CreateGroup(MatrixList);
if(Group == NULL) return FALSE;
if(!Geoset->AddGroup(Group)) return FALSE;
X = static_cast<FLOAT>(Width / 2);
Y = static_cast<FLOAT>(Height / 2);
TextureFactorX = (RealWidth == 0) ? 1.0f : (static_cast<FLOAT>(Width) / static_cast<FLOAT>(RealWidth));
TextureFactorY = (RealHeight == 0) ? 1.0f : (static_cast<FLOAT>(Height) / static_cast<FLOAT>(RealHeight));
Vertex = CreateVertex(D3DXVECTOR3(0.0f, -X, Y), D3DXVECTOR3(1.0f, 0.0f, 0.0f), D3DXVECTOR2(0.0f, 0.0f), 0);
if(Vertex == NULL) return FALSE;
if(!Geoset->AddVertex(Vertex)) return FALSE;
Vertex = CreateVertex(D3DXVECTOR3(0.0f, X, Y), D3DXVECTOR3(1.0f, 0.0f, 0.0f), D3DXVECTOR2(TextureFactorX, 0.0f), 0);
if(Vertex == NULL) return FALSE;
if(!Geoset->AddVertex(Vertex)) return FALSE;
Vertex = CreateVertex(D3DXVECTOR3(0.0f, -X, -Y), D3DXVECTOR3(1.0f, 0.0f, 0.0f), D3DXVECTOR2(0.0f, TextureFactorY), 0);
if(Vertex == NULL) return FALSE;
if(!Geoset->AddVertex(Vertex)) return FALSE;
Vertex = CreateVertex(D3DXVECTOR3(0.0f, X, -Y), D3DXVECTOR3(1.0f, 0.0f, 0.0f), D3DXVECTOR2(TextureFactorX, TextureFactorY), 0);
if(Vertex == NULL) return FALSE;
if(!Geoset->AddVertex(Vertex)) return FALSE;
Face = CreateFace(0, 2, 3);
if(Face == NULL) return FALSE;
if(!Geoset->AddFace(Face)) return FALSE;
Face = CreateFace(0, 3, 1);
if(Face == NULL) return FALSE;
if(!Geoset->AddFace(Face)) return FALSE;
Geoset->MaterialNode.Attach(Material->GeosetNodes);
Layer->TextureNode.Attach(Texture->MaterialLayerNodes);
Bone->GeosetNode.Attach(Geoset->BoneNodes);
return TRUE;
}
//+-----------------------------------------------------------------------------
//| Creates a default loading screen model
//+-----------------------------------------------------------------------------
BOOL MODEL::CreateLoadingScreenModel(CONST std::string& TextureFileName)
{
MODEL_BONE* Bone;
MODEL_GEOSET* Geoset;
MODEL_TEXTURE* Texture;
MODEL_MATERIAL* Material;
MODEL_MATERIAL_LAYER* Layer;
MODEL_GEOSET_VERTEX* Vertex;
MODEL_GEOSET_FACE* Face;
MODEL_GEOSET_GROUP* Group;
MODEL_SEQUENCE* Sequence;
std::vector<INT> MatrixList;
ModelData.Info.Name = "LoadingScreen";
ModelData.Info.BlendTime = 150;
Texture = new MODEL_TEXTURE();
if(Texture == NULL)
{
Error.SetMessage("Unable to load \"" + TextureFileName + "\", memory allocation failed!");
return FALSE;
}
Texture->Data().FileName = TextureFileName;
if(!AddTexture(Texture)) return FALSE;
Material = new MODEL_MATERIAL();
if(Material == NULL)
{
Error.SetMessage("Unable to load \"" + TextureFileName + "\", memory allocation failed!");
return FALSE;
}
Material->Data().FullResolution = TRUE;
if(!AddMaterial(Material)) return FALSE;
Layer = new MODEL_MATERIAL_LAYER();
if(Layer == NULL)
{
Error.SetMessage("Unable to load \"" + TextureFileName + "\", memory allocation failed!");
return FALSE;
}
Layer->Data().FilterMode = FILTER_MODE_NONE;
Layer->Data().TextureId = ModelData.TextureContainer.GetLastAddedIndex();
Layer->Data().AnimatedTextureId.SetStaticScalarInt(Layer->Data().TextureId);
Layer->Data().Alpha.SetStaticScalar(1.0f);
Layer->Data().Unshaded = TRUE;
Layer->Data().Unfogged = TRUE;
Layer->Data().TwoSided = TRUE;
if(!Material->AddLayer(Layer)) return FALSE;
Geoset = new MODEL_GEOSET();
if(Geoset == NULL)
{
Error.SetMessage("Unable to load \"" + TextureFileName + "\", memory allocation failed!");
return FALSE;
}
if(!AddGeoset(Geoset)) return FALSE;
Bone = new MODEL_BONE();
if(Bone == NULL)
{
Error.SetMessage("Unable to load \"" + TextureFileName + "\", memory allocation failed!");
return FALSE;
}
Bone->Data().Name = "LoadingScreenBone";
if(!AddBone(Bone)) return FALSE;
Sequence = new MODEL_SEQUENCE();
if(Sequence == NULL)
{
Error.SetMessage("Unable to load \"" + TextureFileName + "\", memory allocation failed!");
return FALSE;
}
Sequence->Data().Name = "Birth";
Sequence->Data().NonLooping = TRUE;
Sequence->Data().Interval = D3DXVECTOR2(1000.0f, 2000.0f);
if(!AddSequence(Sequence)) return FALSE;
MatrixList.push_back(0);
Group = CreateGroup(MatrixList);
if(Group == NULL) return FALSE;
if(!Geoset->AddGroup(Group)) return FALSE;
Vertex = CreateVertex(D3DXVECTOR3(0.8f, 0.0f, 0.0f), D3DXVECTOR3(0.0f, 0.0f, 1.0f), D3DXVECTOR2(1.0f, 1.0f), 0);
if(Vertex == NULL) return FALSE;
if(!Geoset->AddVertex(Vertex)) return FALSE;
Vertex = CreateVertex(D3DXVECTOR3(0.8f, 0.59999f, 0.0f), D3DXVECTOR3(0.0f, 0.0f, 1.0f), D3DXVECTOR2(1.0f, 0.0f), 0);
if(Vertex == NULL) return FALSE;
if(!Geoset->AddVertex(Vertex)) return FALSE;
Vertex = CreateVertex(D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DXVECTOR3(0.0f, 0.0f, 1.0f), D3DXVECTOR2(0.0f, 1.0f), 0);
if(Vertex == NULL) return FALSE;
if(!Geoset->AddVertex(Vertex)) return FALSE;
Vertex = CreateVertex(D3DXVECTOR3(0.0f, 0.59999f, 0.0f), D3DXVECTOR3(0.0f, 0.0f, 1.0f), D3DXVECTOR2(0.0f, 0.0f), 0);
if(Vertex == NULL) return FALSE;
if(!Geoset->AddVertex(Vertex)) return FALSE;
Face = CreateFace(3, 2, 1);
if(Face == NULL) return FALSE;
if(!Geoset->AddFace(Face)) return FALSE;
Face = CreateFace(0, 1, 2);
if(Face == NULL) return FALSE;
if(!Geoset->AddFace(Face)) return FALSE;
Geoset->MaterialNode.Attach(Material->GeosetNodes);
Layer->TextureNode.Attach(Texture->MaterialLayerNodes);
Bone->GeosetNode.Attach(Geoset->BoneNodes);
return TRUE;
}
//+-----------------------------------------------------------------------------
//| Generates real object IDs for all components
//+-----------------------------------------------------------------------------
VOID MODEL::GenerateObjectIds()
{
INT i;
INT j;
INT k;
INT Index;
MODEL_BASE* Node;
MODEL_GEOSET* Geoset;
MODEL_GEOSET_GROUP* GeosetGroup;
MODEL_GEOSET_GROUP_NODE* GeosetGroupNode;
MODEL_MATERIAL* Material;
MODEL_MATERIAL_LAYER* Layer;
INTERPOLATOR* Interpolator;
REFERENCE<INTERPOLATOR*, INTERPOLATOR*>* CurrentReference;
ObjectIdManager.ClearAllObjectIds();
CONTAINER_GENERATE_ID(ModelData.BoneContainer);
CONTAINER_GENERATE_ID(ModelData.LightContainer);
CONTAINER_GENERATE_ID(ModelData.HelperContainer);
CONTAINER_GENERATE_ID(ModelData.AttachmentContainer);
CONTAINER_GENERATE_ID(ModelData.ParticleEmitterContainer);
CONTAINER_GENERATE_ID(ModelData.ParticleEmitter2Container);
CONTAINER_GENERATE_ID(ModelData.RibbonEmitterContainer);
CONTAINER_GENERATE_ID(ModelData.EventObjectContainer);
CONTAINER_GENERATE_ID(ModelData.CollisionShapeContainer);
for(i = 0; i < ModelData.BaseContainer.GetTotalSize(); i++)
{
if(ModelData.BaseContainer.ValidIndex(i))
{
Node = ModelData.BaseContainer[i];
if(Node->ParentNode.GetObjectData() == Root)
{
Node->BaseData()->ParentId = INVALID_INDEX;
}
else
{
Node->BaseData()->ParentId = Node->ParentNode.GetObjectData()->BaseData()->ObjectId;
}
}
}
CONTAINER_ASSIGN_ID(ModelData.MaterialContainer, InternalMaterialId);
CONTAINER_ASSIGN_ID(ModelData.GlobalSequenceContainer, InternalGlobalSequenceId);
CONTAINER_ASSIGN_ID(ModelData.GeosetContainer, InternalGeosetId);
CONTAINER_ASSIGN_ID(ModelData.GeosetAnimationContainer, InternalGeosetAnimationId);
CONTAINER_ASSIGN_ID(ModelData.TextureContainer, InternalTextureId);
CONTAINER_ASSIGN_ID(ModelData.TextureAnimationContainer, InternalTextureAnimationId);
CONTAINER_RETRIEVE_ID(ModelData.GeosetContainer, MaterialNode, MaterialId, InternalMaterialId);
CONTAINER_RETRIEVE_ID(ModelData.EventObjectContainer, GlobalSequenceNode, GlobalSequenceId, InternalGlobalSequenceId);
CONTAINER_RETRIEVE_ID(ModelData.BoneContainer, GeosetNode, GeosetId, InternalGeosetId);
CONTAINER_RETRIEVE_ID(ModelData.BoneContainer, GeosetAnimationNode, GeosetAnimationId, InternalGeosetAnimationId);
CONTAINER_RETRIEVE_ID(ModelData.GeosetAnimationContainer, GeosetNode, GeosetId, InternalGeosetId);
CONTAINER_RETRIEVE_ID(ModelData.ParticleEmitter2Container, TextureNode, TextureId, InternalTextureId);
CONTAINER_RETRIEVE_ID(ModelData.RibbonEmitterContainer, MaterialNode, MaterialId, InternalMaterialId);
for(i = 0; i < ModelData.GeosetContainer.GetTotalSize(); i++)
{
if(ModelData.GeosetContainer.ValidIndex(i))
{
Geoset = ModelData.GeosetContainer[i];
for(j = 0; j < Geoset->Data().GroupContainer.GetTotalSize(); j++)
{
if(Geoset->Data().GroupContainer.ValidIndex(j))
{
GeosetGroup = Geoset->Data().GroupContainer[j];
for(k = 0; k < GeosetGroup->MatrixList.GetTotalSize(); k++)
{
if(GeosetGroup->MatrixList.ValidIndex(k))
{
GeosetGroupNode = GeosetGroup->MatrixList[k];
if(GeosetGroupNode->Node.IsAttached())
{
GeosetGroupNode->NodeId = GeosetGroupNode->Node.GetObjectData()->BaseData()->ObjectId;
}
else
{
GeosetGroupNode->NodeId = 0;
}
}
}
}
}
}
}
for(i = 0; i < ModelData.MaterialContainer.GetTotalSize(); i++)
{
if(ModelData.MaterialContainer.ValidIndex(i))
{
Material = ModelData.MaterialContainer[i];
for(j = 0; j < Material->Data().LayerContainer.GetTotalSize(); j++)
{
if(Material->Data().LayerContainer.ValidIndex(j))
{
Layer = Material->Data().LayerContainer[j];
if(Layer->TextureNode.IsAttached())
{
Layer->Data().TextureId = Layer->TextureNode.GetObjectData()->Data().InternalTextureId;
Layer->Data().AnimatedTextureId.SetStaticScalarInt(Layer->Data().TextureId);
}
else
{
Layer->Data().TextureId = INVALID_INDEX;
}
}
}
}
}
Index = 0;
for(i = 0; i < ModelData.AttachmentContainer.GetTotalSize(); i++)
{
if(ModelData.AttachmentContainer.ValidIndex(i))
{
ModelData.AttachmentContainer[i]->Data().AttachmentId = Index;
Index++;
}
}
CurrentReference = INTERPOLATOR::InterpolatorNodes.GetFirstReference();
while(CurrentReference != NULL)
{
Interpolator = CurrentReference->GetData();
if(Interpolator->GlobalSequenceNode.IsAttached())
{
Interpolator->SetGlobalSequenceId(Interpolator->GlobalSequenceNode.GetObjectData()->Data().InternalGlobalSequenceId);
}
CurrentReference = INTERPOLATOR::InterpolatorNodes.GetNextReference(CurrentReference);
}
}
//+-----------------------------------------------------------------------------
//| Connects the nodes with its parents etc...
//+-----------------------------------------------------------------------------
VOID MODEL::ConnectNodes()
{
INT i;
INT j;
INT k;
INT Id;
MODEL_BASE* Node;
MODEL_BASE* ParentNode;
MODEL_GEOSET* Geoset;
MODEL_GEOSET_GROUP* GeosetGroup;
MODEL_GEOSET_GROUP_NODE* GeosetGroupNode;
MODEL_MATERIAL* Material;
INTERPOLATOR* Interpolator;
REFERENCE<INTERPOLATOR*, INTERPOLATOR*>* CurrentReference;
for(i = 0; i < ModelData.BaseContainer.GetTotalSize(); i++)
{
if(ModelData.BaseContainer.ValidIndex(i))
{
Node = ModelData.BaseContainer[i];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -