⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 icezcbbreaker.cpp

📁 使用stl技术,(还没看,是听说的)
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	{
		// 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 + -