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

📄 meshserializer.cpp

📁 java实现的简单的分形树。简单易学!是学习分形知识的很好的例子。其java语法简单
💻 CPP
字号:
// --------------------------------------------------------------------------
// Dingus project - a collection of subsystems for game/graphics applications
// --------------------------------------------------------------------------
#include "stdafx.h"

#include "MeshSerializer.h"
#include "VertexDeclBundle.h"

using namespace dingus;

#define READ_4BYTE(var) fread(&var,1,4,f)
#define READ_2BYTE(var) fread(&var,1,2,f)

static inline std::string gReadString( FILE* f )
{
	std::string str;
	while( true ) {
		int c = fgetc( f );
		if( c==0 || c==EOF )
			break;
		str += (char)c;
	}
	return str;
}

bool CMeshSerializer::loadMeshFromFile( const char* fileName, CMesh& mesh )
{
	// open file
	FILE* f = fopen( fileName, "rb" );
	if( !f ) return false;

	//
	// read header

	// magic
	char magic[4];
	READ_4BYTE(magic);
	if( magic[0]!='D' || magic[1]!='M' || magic[2]!='S' || magic[3]!='H' ) {
		fclose( f );
		return false;
	}
	// header
	int nverts, ntris, ngroups, vstride, istride, vformat;
	READ_4BYTE(nverts);
	READ_4BYTE(ntris);
	READ_4BYTE(ngroups);
	READ_4BYTE(vstride);
	READ_4BYTE(vformat);
	READ_4BYTE(istride);
	assert( nverts > 0 );
	assert( ntris > 0 );
	assert( ngroups > 0 );
	assert( vstride > 0 );
	assert( istride==2 || istride==4 );
	assert( vformat != 0 );

	// init mesh
	assert( !mesh.isCreated() );
	CVertexFormat format(vformat);
	assert( format.calcVertexSize() == vstride );
	CD3DVertexDecl* vertDecl = RGET_VDECL( CVertexDesc( format ) );
	mesh.createResource( nverts, ntris*3, format, istride, *vertDecl, CMesh::BUF_STATIC );

	// read vertices
	void* vb = mesh.lockVB( false );
	fread( vb, vstride, nverts, f );
	mesh.unlockVB();

	// read indices
	void* ib = mesh.lockIB( false );
	fread( ib, istride, ntris*3, f );
	mesh.unlockIB();

	// read groups
	for( int i = 0; i < ngroups; ++i ) {
		int vstart, vcount, fstart, fcount;
		READ_4BYTE(vstart);
		READ_4BYTE(vcount);
		READ_4BYTE(fstart);
		READ_4BYTE(fcount);
		// HACK: TBD: for null groups
		if( ngroups==1 && vcount==0 && fcount==0 ) {
			vstart = 0;
			vcount = nverts;
			fstart = 0;
			fcount = ntris;
		}
		mesh.addGroup( CMesh::CGroup(vstart,vcount,fstart,fcount) );
	}

	// close file
	fclose( f );
	return true;
}


/*
CSkeletonInfo* CMeshSerializer::loadSkelInfoFromFile( const char* fileName )
{
	// open file
	FILE* f = fopen( fileName, "rb" );
	if( !f ) return NULL;

	//
	// read header

	// magic
	char magic[4];
	READ_4BYTE(magic);
	if( magic[0]!='D' || magic[1]!='M' || magic[2]!='S' || magic[3]!='H' ) {
		fclose( f );
		return NULL;
	}
	// header
	int nverts, ntris, ngroups, vstride, istride, vformat;
	READ_4BYTE(nverts);
	READ_4BYTE(ntris);
	READ_4BYTE(ngroups);
	READ_4BYTE(vstride);
	READ_4BYTE(vformat);
	READ_4BYTE(istride);
	assert( nverts > 0 );
	assert( ntris > 0 );
	assert( ngroups > 0 );
	assert( vstride > 0 );
	assert( istride==2 || istride==4 );
	assert( vformat != 0 );

	CVertexFormat format(vformat);
	if( format.getSkinMode() == CVertexFormat::SKIN_NONE )
		return NULL;

	// skip mesh geometry data
	int skelDataOffset = 0;
	skelDataOffset += vstride * nverts; // vertices
	skelDataOffset += istride * ntris * 3; // indices
	skelDataOffset += 4*4 * ngroups; // groups
	fseek( f, skelDataOffset, SEEK_CUR );

	// read skel info
	int nbones;
	READ_4BYTE(nbones);
	assert( nbones > 0 );
	CSkeletonInfo* skelInfo = new CSkeletonInfo( nbones );
	for( int b = 0; b < nbones; ++b ) {
		std::string name = gReadString( f );
		int parentIdx;
		SMatrix4x4 boneMat;
		boneMat.identify();
		READ_4BYTE(parentIdx);
		READ_4BYTE(boneMat._11); READ_4BYTE(boneMat._12); READ_4BYTE(boneMat._13);
		READ_4BYTE(boneMat._21); READ_4BYTE(boneMat._22); READ_4BYTE(boneMat._23);
		READ_4BYTE(boneMat._31); READ_4BYTE(boneMat._32); READ_4BYTE(boneMat._33);
		READ_4BYTE(boneMat._41); READ_4BYTE(boneMat._42); READ_4BYTE(boneMat._43);
		skelInfo->addBoneInfo( parentIdx, boneMat, name );
	}

	// close file
	fclose( f );
	return skelInfo;
}
*/

⌨️ 快捷键说明

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