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

📄 skin.cpp

📁 游戏编程精华02-含有几十个游戏编程例子
💻 CPP
字号:
/**********************************************************************
 	MODULE: SkelDemo
	
	DESCRIPTION: This module is a demo of how to pratically use MRC data
				 to finally render the animation in an OpenGl window.				 	
	
	DEVELOPED BY:		MARCO TOMBESI
	CONTACT:		e-mail:		baggior@libero.it		
					web-page:	digilander.iol.it/baggior

 *>	Copyright (c) Marco Tombesi, 2001
 **********************************************************************/

#include "skin.h"

//========================================================================================
//////////////////////////////////////////////////////////
_Skin::_Skin() :RootBone()
{
	Color[0]=1.0;	Color[1]=0.5;	Color[2]=1.0;
	FaceCnt = NormCnt = VertCnt = 0;
	TempVert = Vert = NULL;
	Face = NULL;
	Norm = NULL;
}

//////////////////////////////////////////////////////////
// build the object from the MRCdata pointer
//////////////////////////////////////////////////////////
_Skin::_Skin(const MRC_t* MRCdata) : RootBone(MRCdata) 
{	
	Color[0]=1.0;	Color[1]=0.5;	Color[2]=1.0;

	FaceCnt = MRCdata->face_cnt;
	NormCnt = MRCdata->norm_cnt;
	VertCnt = MRCdata->vert_cnt;
	
	if (NormCnt) {
		//TODO: for now just one normal per vertex (NO SMOOTHING GROOPS)
		Norm = new vertex_t[NormCnt];
		memcpy(Norm,MRCdata->norms,NormCnt*sizeof(vertex_t));
	}
	else Norm = NULL;

	if (VertCnt) {
		Vert = new vertex_t[VertCnt];
		TempVert = new vertex_t[VertCnt];
		memcpy(Vert,MRCdata->verts,VertCnt*sizeof(vertex_t));
	}
	else Vert = NULL;

	if (FaceCnt) {
		//TODO: for now just one normal per vertex (NO SMOOTHING GROOPS)
		Face = new faceIdx[FaceCnt];
		for (int i=0;i<FaceCnt;++i)
			memcpy(Face[i],MRCdata->faces[i].v,3*sizeof(int));
	}
	else Face = NULL;

	memset(TempVert,0, sizeof(vertex_t)*VertCnt);
	UpdateTempData(RootBone);
}

//////////////////////////////////////////////////////////
_Skin::~_Skin() {
	if (Face) delete [] Face;
	if (Vert) delete [] Vert;
	if (Norm) delete [] Norm;
}

//////////////////////////////////////////////////////////
_Skin::UpdateTempData( _Bone &Bone) {

	//Deform mesh data
	vertex_t temp1,temp2;
	for (int j=0;j<Bone.VertexCount;++j)
	{
		const int &idx=Bone.BoneWeights[j].Index;
		MatXVect(temp1, Bone.InverseOrient_TM, Vert[idx]);
		MatXVect(temp2, Bone.BoneAnim_TM, temp1);

		VectMul(temp2,temp2,Bone.BoneWeights[j].Weight);
		
		VectAdd(TempVert[idx],TempVert[idx],temp2);
	}
	
	for (int i=0;i<Bone.BoneChildsCount;++i)
	{
		UpdateTempData (*Bone.BoneChilds[i]);		
	}	
}

//////////////////////////////////////////////////////////
_Skin::Update(ulong mSecGlobal) {
	
	//update bone transformation
	RootBone.Update(mSecGlobal);
	
	//reset temp mesh data
	memset(TempVert,0, sizeof(vertex_t)*VertCnt);

	//Deform mesh data
	UpdateTempData(RootBone);
}
//========================================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -