📄 icezcbbreaker.cpp
字号:
{
// Uh... unknown header... corrupted file ?
ZCBImportError("Invalid ZCB file.", ZCB_ERROR_INVALID_FILE);
return false;
}
// Import the file
if(mFileType==ZCB_FILE_SCENE)
{
#ifdef ZCB_PROGRESS_BAR
InitProgressBar();
gParams->mRequestCode = RQ_CREATE_PROGRESS_BAR;
GetCallbacksManager()->ExecCallbacks(ICCB_REQUEST, ICCB_REQUEST, gParams);
gParams->mMin = 0;
gParams->mMax = 9;
gParams->mRequestCode = RQ_SET_RANGE_PROGRESS_BAR0;
GetCallbacksManager()->ExecCallbacks(ICCB_REQUEST, ICCB_REQUEST, gParams);
gParams->mText = "Importing file...";
gParams->mRequestCode = RQ_SET_TEXT_PROGRESS_BAR0;
GetCallbacksManager()->ExecCallbacks(ICCB_REQUEST, ICCB_REQUEST, gParams);
#endif
// Find MAIN chunk
if(mImportArray->GetChunk(mZCBGlobalVersion ? "MAINCHUNK" : "MAIN"))
{
// Get chunk version
mMAINVersion = mImportArray->GetDword();
ZCB_CHECKVERSION(mMAINVersion, CHUNK_MAIN_VER, "MAIN");
// Ugly but....
if(mMAINVersion>=2) gHasPivot = true;
else gHasPivot = false;
// Fill a scene structure
ZCBSceneInfo SceneInfo;
// Time-related info
SceneInfo.mFirstFrame = mImportArray->GetDword();
SceneInfo.mLastFrame = mImportArray->GetDword();
SceneInfo.mFrameRate = mImportArray->GetDword();
SceneInfo.mDeltaTime = mImportArray->GetDword();
// Background color
SceneInfo.mBackColor.x = mImportArray->GetFloat();
SceneInfo.mBackColor.y = mImportArray->GetFloat();
SceneInfo.mBackColor.z = mImportArray->GetFloat();
// Global ambient color
SceneInfo.mAmbientColor.x = mImportArray->GetFloat();
SceneInfo.mAmbientColor.y = mImportArray->GetFloat();
SceneInfo.mAmbientColor.z = mImportArray->GetFloat();
// Scene info
if(mMAINVersion>=2) SceneInfo.mSceneInfo.Set((const char*)mImportArray->GetString());
if(mMAINVersion>=4)
{
SceneInfo.mSceneHelpText.Set((const char*)mImportArray->GetString());
if(mMAINVersion>=5)
{
SceneInfo.mTesselation = mImportArray->GetDword();
}
if(mMAINVersion>=6)
{
SceneInfo.mLightingMode = mImportArray->GetDword();
}
// Scene physics
SceneInfo.mGravity.x = mImportArray->GetFloat();
SceneInfo.mGravity.y = mImportArray->GetFloat();
SceneInfo.mGravity.z = mImportArray->GetFloat();
SceneInfo.mRestitution = mImportArray->GetFloat();
SceneInfo.mStaticFriction = mImportArray->GetFloat();
SceneInfo.mFriction = mImportArray->GetFloat();
SceneInfo.mGroundPlane = mImportArray->GetByte()!=0;
SceneInfo.mCollisionDetection = mImportArray->GetByte()!=0;
}
if(mMAINVersion>=3) SceneInfo.mGlobalScale = mImportArray->GetFloat();
// Get number of expected elements
mNbMeshes = SceneInfo.mNbMeshes = mImportArray->GetDword();
mNbDerived = SceneInfo.mNbDerived = mImportArray->GetDword();
mNbCameras = SceneInfo.mNbCameras = mImportArray->GetDword();
mNbLights = SceneInfo.mNbLights = mImportArray->GetDword();
mNbShapes = SceneInfo.mNbShapes = mImportArray->GetDword();
mNbHelpers = SceneInfo.mNbHelpers = mImportArray->GetDword();
mNbControllers = SceneInfo.mNbControllers = mImportArray->GetDword();
mNbMaterials = SceneInfo.mNbMaterials = mImportArray->GetDword();
mNbTextures = SceneInfo.mNbTextures = mImportArray->GetDword();
mNbUnknowns = SceneInfo.mNbUnknowns = mImportArray->GetDword();
mNbInvalidNodes = SceneInfo.mNbInvalidNodes = mImportArray->GetDword();
// Call the app
NewScene(SceneInfo);
UpdateProgressBar0();
}
else
{
ZCBImportError("Chunk MAIN not found!", ZCB_ERROR_CHUNK_NOT_FOUND);
return Cleanup();
}
// Import everything
ImportMotion (*mImportArray);
if(!ImportCameras (*mImportArray)) return Cleanup(); UpdateProgressBar0();
if(!ImportLights (*mImportArray)) return Cleanup(); UpdateProgressBar0();
if(!ImportTextures (*mImportArray)) return Cleanup(); UpdateProgressBar0();
if(!ImportMaterials (*mImportArray)) return Cleanup(); UpdateProgressBar0();
if(!ImportMeshes (*mImportArray)) return Cleanup(); UpdateProgressBar0();
if(!ImportShapes (*mImportArray)) return Cleanup(); UpdateProgressBar0();
if(!ImportHelpers (*mImportArray)) return Cleanup(); UpdateProgressBar0();
if(!ImportControllers (*mImportArray)) return Cleanup(); UpdateProgressBar0();
Cleanup();
}
else if(mFileType==ZCB_FILE_MOTION)
{
if(!ImportMotion (*mImportArray)) return false;
}
else
{
ZCBImportError("Invalid ZCB file.", ZCB_ERROR_INVALID_FILE);
return false;
}
// Release array
DELETESINGLE(mImportArray);
return true;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Imports a BIPED motion
* \param importer [in] the imported array.
* \return true if success.
*/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool ZCBBreaker::ImportMotion(CustomArray& importer)
{
// Find MOVE chunk
if(importer.GetChunk(mZCBGlobalVersion ? "MOVECHUNK" : "MOVE"))
{
// Get version number back
mMOVEVersion = importer.GetDword();
ZCB_CHECKVERSION(mMOVEVersion, CHUNK_MOVE_VER, "MOVE");
// Log message
ZCBLog("Importing BIPED motion...\n");
// Fill a motion structure
ZCBMotionInfo Mot;
Mot.mCharID = importer.GetDword(); // LinkID
Mot.mNbBones = importer.GetDword(); // Nb bones
Mot.mNbVBones = importer.GetDword(); // Nb virtual bones
// Since version 2
if(mMOVEVersion>=2) Mot.mLocalPRS = importer.GetByte()!=0; // Local/global PRS
else Mot.mLocalPRS = true; // Arbitrary
// Since version 4
if(mMOVEVersion>=4) Mot.mD3DCompliant = importer.GetByte()!=0; // D3D compatible
else Mot.mD3DCompliant = false;
// Since version 3
if(mMOVEVersion>=3) Mot.mName.Set((const char*)importer.GetString()); // The motion's name
else Mot.mName.Set((const char*)"MotionName");
if(mMOVEVersion>=3) Mot.mType.Set((const char*)importer.GetString()); // The motion's type
else Mot.mType.Set((const char*)"MotionType");
Mot.mData = importer.GetAddress(); // Motion data
// Call the app
NewMotion(Mot);
}
else
{
// MOVE chunk is mandatory for motion files only
if(mFileType==ZCB_FILE_MOTION)
{
ZCBImportError("Chunk MOVE not found!", ZCB_ERROR_CHUNK_NOT_FOUND);
return false;
}
}
return true;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Imports basic object information.
* \param importer [in] the imported array.
* \return true if success.
*/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool ZCBBaseInfo::Import(CustomArray& importer)
{
// Database information
mName.Set((const char*)importer.GetString()); // The object's name
mID = importer.GetDword(); // The object's ID
mParentID = importer.GetDword(); // The parent's ID
if(gZCBVersion>=0x2)
{
mMasterID = importer.GetDword(); // ID of master object (ex: we're an instance)
mTargetID = importer.GetDword(); // ID of target object (ex: we're a camera)
}
else
{
// In old versions we only had a "link ID" whose role depended on context
mTargetID = importer.GetDword(); // The link ID (target nodes, master objects, etc)
mMasterID = mTargetID;
}
mGroup = importer.GetByte()!=0; // true if the object belongs to a group
if(gZCBVersion>=0x3)
{
mIsHidden = importer.GetByte()!=0;
}
// PRS
mPrs.mPos.x = importer.GetFloat(); // Position x
mPrs.mPos.y = importer.GetFloat(); // Position y
mPrs.mPos.z = importer.GetFloat(); // Position z
mPrs.mRot.p.x = importer.GetFloat(); // Rotation x
mPrs.mRot.p.y = importer.GetFloat(); // Rotation y
mPrs.mRot.p.z = importer.GetFloat(); // Rotation z
mPrs.mRot.w = importer.GetFloat(); // Rotation w
mPrs.mScale.x = importer.GetFloat(); // Scale x
mPrs.mScale.y = importer.GetFloat(); // Scale y
mPrs.mScale.z = importer.GetFloat(); // Scale z
// Rendering information
mWireColor = importer.GetDword(); // The wireframe color
mLocalPRS = importer.GetByte()!=0; // true for local PRS
mD3DCompliant = importer.GetByte()!=0; // true if converted to D3D frame
if(gZCBVersion>=0x3)
{
mDensity = importer.GetFloat();
mMass = importer.GetFloat();
mSamplingDensity = importer.GetDword();
mResetPivot = importer.GetByte()!=0;
mIsCollidable = importer.GetByte()!=0;
mLockPivot = importer.GetByte()!=0;
}
// User-properties
mUserProps.Set((const char*)importer.GetString()); // The user-defined properties
// Get pivot
if(gHasPivot)
{
mPivotPos.x = importer.GetFloat(); // Position x
mPivotPos.y = importer.GetFloat(); // Position y
mPivotPos.z = importer.GetFloat(); // Position z
mPivotRot.p.x = importer.GetFloat(); // Rotation x
mPivotRot.p.y = importer.GetFloat(); // Rotation y
mPivotRot.p.z = importer.GetFloat(); // Rotation z
mPivotRot.w = importer.GetFloat(); // Rotation w
}
else
{
mPivotPos.Zero();
mPivotRot.Identity();
}
return true;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Imports the cameras.
* \param importer [in] the imported array.
* \return true if success.
*/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool ZCBBreaker::ImportCameras(CustomArray& importer)
{
#ifdef ZCB_PROGRESS_BAR
gParams->mText = "Importing cameras...";
gParams->mRequestCode = RQ_SET_TEXT_PROGRESS_BAR1;
GetCallbacksManager()->ExecCallbacks(ICCB_REQUEST, ICCB_REQUEST, gParams);
gParams->mMin = 0;
gParams->mMax = mNbCameras;
gParams->mRequestCode = RQ_SET_RANGE_PROGRESS_BAR1;
GetCallbacksManager()->ExecCallbacks(ICCB_REQUEST, ICCB_REQUEST, gParams);
#endif
// Are there any cameras to import?
if(mNbCameras)
{
// Find CAMS chunk
if(importer.GetChunk(mZCBGlobalVersion ? "CAMSCHUNK" : "CAMS"))
{
// Get version number back
mCAMSVersion = importer.GetDword();
ZCB_CHECKVERSION(mCAMSVersion, CHUNK_CAMS_VER, "CAMS");
// Log message
ZCBLog("Importing %d cameras...\n", mNbCameras);
// Import all cameras
for(udword n=0;n<mNbCameras;n++)
{
// Fill a camera structure
ZCBCameraInfo CurCam;
// Base info
CurCam.Import(importer);
// Get camera information back
CurCam.mOrthoCam = importer.GetByte()!=0; // Camera type: ortographic (true) or perspective (false)
CurCam.mFOV = importer.GetFloat(); // Field-Of-View (degrees) or Width for ortho cams
CurCam.mNearClip = importer.GetFloat(); // Near/hither clip
CurCam.mFarClip = importer.GetFloat(); // Far/yon clip
CurCam.mTDist = importer.GetFloat(); // Distance to target
CurCam.mHLineDisplay = importer.GetDword(); // Horizon Line Display
CurCam.mEnvNearRange = importer.GetFloat(); // Environment near range
CurCam.mEnvFarRange = importer.GetFloat(); // Environment far range
CurCam.mEnvDisplay = importer.GetDword(); // Environment display
CurCam.mManualClip = importer.GetDword(); // Manual clip
if(mCAMSVersion>=2)
{
CurCam.mFOVType = (ZCBFOVType)importer.GetDword(); // FOV type
CurCam.mType = (ZCBCameraType)importer.GetDword(); // Camera type
}
// Call the app
NewCamera(CurCam);
UpdateProgressBar1();
}
}
else
{
ZCBImportError("Chunk CAMS not found!", ZCB_ERROR_CHUNK_NOT_FOUND);
return false;
}
}
return true;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Imports the lights.
* \param importer [in] the imported array.
* \return true if success.
*/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -