Пример #1
0
	void Water::Load(const char * source)
	{
		DataStreamPtr stream = ResourceManager::Instance()->OpenResource(source);

		if (stream == NULL)
			return ;

		int Magic, Version;

		stream->Read(&Magic, sizeof(int));
		stream->Read(&Version, sizeof(int));

		d_assert (Magic == K_Magic);

		d_assert (Version == 0);

		if (Version == 0)
		{
			int sizeX, sizeZ;

			stream->Read(&sizeX, sizeof(int));
			stream->Read(&sizeZ, sizeof(int));

			d_assert (sizeX == mSizeX && sizeZ == mSizeZ);

			stream->Read(&mHeight, sizeof(float));

			stream->Read(mData, sizeX * sizeZ);
		}

		_initBlock();
	}
Пример #2
0
void MeshLoader_v0::ReadIndexStream(SubMesh * sm, DataStreamPtr & stream)
{
    int count = sm->GetIndexStream()->GetCount();
    unsigned char stride;
    bool index16 = true;;

    stream->Read(&stride, sizeof(unsigned char));

    switch (stride)
    {
    case sizeof(short):
        index16 = true;
        break;

    case sizeof(int):
        index16 = false;
        break;

    default:
        EXCEPTION_DEBUG(0, "invalid index format.");
        break;
    }

    IndexBufferPtr pIndexBuffer = VideoBufferManager::Instance()->CreateIndexBuffer(stride * count, index16);
    void * indices;

    int start;
    stream->Read(&start, sizeof(int));

    indices = pIndexBuffer->Lock(0, 0, LOCK_DISCARD);
    stream->Read(indices, stride * count);
    pIndexBuffer->Unlock();

    sm->GetIndexStream()->Bind(pIndexBuffer, start);
}
Пример #3
0
void MeshLoader_v0::ReadVertexStream(VertexBufferPtr & vb, int & stride, int count, DataStreamPtr & stream)
{
    EXCEPTION_DEBUG(vb.IsNull(), "model file error.");

    stream->Read(&stride, sizeof(int));

    vb = VideoBufferManager::Instance()->CreateVertexBuffer(stride * count, stride);
    
    void * data = vb->Lock(0, 0, LOCK_DISCARD);

    stream->Read(data, stride * count);

    vb->Unlock();
}
Пример #4
0
void MeshLoader_v0::ReadDeclaration(short id, VertexDeclarationPtr & decl, DataStreamPtr & stream)
{
    short offset;
    unsigned char type;
    unsigned char usage;
    unsigned char index;

    stream->Read(&offset, sizeof(short));
    stream->Read(&type, sizeof(unsigned char));
    stream->Read(&usage, sizeof(unsigned char));
    stream->Read(&index, sizeof(unsigned char));

    decl->AddElement(id, offset, (DECL_TYPE)type, (DECL_USAGE)usage, index);
}
Пример #5
0
void MeshLoader_v0::ReadBounds(MeshPtr mesh, DataStreamPtr & stream)
{
    Vec3 vMin, vMax, vCenter;
    float fRadius;

    stream->Read(&vMin, sizeof(Vec3));
    stream->Read(&vMax, sizeof(Vec3));

    stream->Read(&vCenter, sizeof(Vec3));
    stream->Read(&fRadius, sizeof(float));

    mesh->SetAabb(vMin, vMax);
    mesh->SetBoundingSphere(vCenter, fRadius);
}
Пример #6
0
void MeshLoader_v1::ReadSkelAnim(MeshPtr mesh, DataStreamPtr & stream)
{
	Skeleton * skel = mesh->GetSkeleton();
	int version = -1;

	stream->Read(&version, sizeof (int));

	d_assert (version == K_SkelAnim_Version);

	char name[128];

	stream->Read(name, 128);

	Animation * anim = mesh->CreateAnimation(name);

	int numAnims = 0;
	stream->Read(&numAnims, sizeof(int));

	for (int i = 0; i < numAnims; ++i)
	{
		int boneId, count;

		stream->Read(&boneId, sizeof(int));
		stream->Read(&count, sizeof(int));

		if (count == 0)
			continue;

		SkeletonAnimation * skel_anim;
		skel_anim = anim->CreateSkeletonAnimation(boneId);

		KeyFrame * kf;
		float time;
		Vec3 trans;
		Quat rotate;
		Vec3 scale;

		for (int i = 0; i < count; ++i)
		{
			stream->Read(&time, sizeof(float));
			stream->Read(&trans, sizeof(float) * 3);
			stream->Read(&rotate, sizeof(float) * 4);
			stream->Read(&scale, sizeof(float) * 3);

			kf = skel_anim->CreateKeyFrame();
			kf->SetTime(time);
			kf->SetTranslate(trans);
			kf->SetRotation(rotate);
			kf->SetScale(scale);
		}
	}

	anim->_calcuLength();
}
Пример #7
0
void MeshLoader_v1::ReadBounds(MeshPtr mesh, DataStreamPtr & stream)
{
	int iVerison;
	Vec3 vMin, vMax, vCenter;
	float fRadius;

	stream->Read(&iVerison, sizeof(int));

	d_assert (iVerison == K_Bound_Version);

	stream->Read(&vMin, sizeof(Vec3));
	stream->Read(&vMax, sizeof(Vec3));

	stream->Read(&vCenter, sizeof(Vec3));
	stream->Read(&fRadius, sizeof(float));

	mesh->SetAabb(vMin, vMax);
	mesh->SetBoundingSphere(vCenter, fRadius);
}
Пример #8
0
	bool Terrain::Load(const String & filename)
	{
		DataStreamPtr stream = ResourceManager::Instance()->OpenResource(filename);
		if (stream == NULL || !IsValid())
			return false;

		ISerializerD IS(stream);

		int magic, version;
		IS >> magic;
		IS >> version;

		d_assert (magic == K_FILE_MAGIC);
		d_assert (version == K_VERSION);

		int ckId;
		while (IS.Read(&ckId, sizeof(int)) && ckId != 0)
		{
			if (ckId == 1001)
			{
				Int2 vertexCount;
				IS >> vertexCount;

				if (vertexCount == mInfo.VertexCount)
				{
					stream->Read(&mHeights[0], sizeof(float) * vertexCount.x * vertexCount.y);
				}
				else if (vertexCount.x < mInfo.VertexCount.x && vertexCount.y < mInfo.VertexCount.y)
				{
					for (int i = 0; i < vertexCount.y; ++i)
					{
						stream->Read(&mHeights[i * vertexCount.x], sizeof(float) * vertexCount.x);
					}
				}
				else
				{
					d_log("?: terrain vertex count don't matched.");
				}

				_calcuNormals();
			}
			else
			{
Пример #9
0
void MeshLoader_v1::ReadSkeleton(MeshPtr mesh, DataStreamPtr & stream)
{
	Skeleton * skel = mesh->GetSkeleton();
	int version = -1;

	stream->Read(&version, sizeof (int));

	d_assert (version == K_Skeleton_Version);

	int boneCount = 0;

	stream->Read(&boneCount, sizeof (int));

	for (int i = 0; i < boneCount; ++i)
	{
		char Name[128];
		int flag;
		Vec3 Position;
		Quat Orientation;
		Vec3 Scale;

		stream->Read(&Name[0],  128);
		stream->Read(&flag, sizeof(int));
		stream->Read(&Position, sizeof(Vec3));
		stream->Read(&Orientation, sizeof(Quat));
		stream->Read(&Scale, sizeof(Vec3)); // equal ratio scale.

		joint * bn = skel->CreateJoint(Name);

		bn->flag = flag;
		bn->position = Position;
		bn->orientation = Orientation;
		bn->scale = Scale;
	}

	for (int i = 0; i < boneCount; ++i)
	{
		short parent;
		short child;

		stream->Read(&parent, sizeof(short));
		stream->Read(&child, sizeof(short));

		skel->SetupHiberarchy(parent, child);
	}
}
Пример #10
0
void MeshLoader::Load(MeshPtr mesh, DataStreamPtr stream)
{
    profile_code();

	char magic[MODEL_FILE_MAGIC_LEN];
	int version;

	stream->Read(magic, MODEL_FILE_MAGIC_LEN);

	d_assert (strcmp(magic, MODEL_FILE_MAGIC) == 0);

	stream->Read(&version, sizeof(int));

	if (version == MODEL_FILE_VERSION)
		MeshLoader_v0::Load(mesh, stream);
	else if (version == MeshLoader_v1::K_File_Verion)
		MeshLoader_v1::Load(mesh, stream);
	else
		d_assert (0);

	stream->Close();
}
Пример #11
0
	XmlNodePtr XmlDoc::Parse(DataStreamPtr const & pSource)
	{
		pSource->Seekg(0, std::ios_base::end);
		int len = static_cast<int>(pSource->Tellg());
		pSource->Seekg(0, std::ios_base::beg);
		m_cXmlSrcs.resize(len + 1, 0);
		pSource->Read(&m_cXmlSrcs[0], len);

		static_cast<rapidxml::xml_document<>*>(m_pDoc.get())->parse<0>(&m_cXmlSrcs[0]);
		m_pNodeRoot = MakeSharedPtr<XmlNode>(static_cast<rapidxml::xml_document<>*>(m_pDoc.get())->first_node());

		return m_pNodeRoot;
	}
Пример #12
0
void MeshLoader_v1::ReadMaterial(SubMesh * sm, DataStreamPtr & stream)
{
	int version;
	int doubleSide, blendMode;
	Color4 emissive, ambient, diffuse, specular;
	float specularPower;
	char emissiveMap[128], diffuseMap[128], normalMap[128], specularMap[128];

	stream->Read(&version, sizeof(int));

	d_assert (version == K_Material_Version);

	stream->Read(&doubleSide, sizeof(int));
	stream->Read(&blendMode, sizeof(int));

	stream->Read(&emissive, sizeof(Color4));
	stream->Read(&ambient, sizeof(Color4));
	stream->Read(&diffuse, sizeof(Color4));
	stream->Read(&specular, sizeof(Color4));
	stream->Read(&specularPower, sizeof(float));

	stream->Read(emissiveMap, 128);
	stream->Read(diffuseMap, 128);
	stream->Read(normalMap, 128);
	stream->Read(specularMap, 128);

	Material * mtl = sm->GetMaterial();

	if (doubleSide == 1)
	{
		mtl->SetCullMode(CULL_NONE);
	}

	mtl->SetBlendMode((BLEND_MODE)blendMode);
	mtl->SetAlphaTestRef(0.5f);

	mtl->SetEmissive(emissive);
	mtl->SetAmbient(ambient);
	mtl->SetDiffuse(diffuse);
	mtl->SetSpecular(specular);

	mtl->SetEmissiveMap(emissiveMap);
	mtl->SetDiffuseMap(diffuseMap);
	mtl->SetNormalMap(normalMap);
	mtl->SetSpecularMap(specularMap);
}
Пример #13
0
void MeshLoader_v1::ReadSubMesh(SubMesh * sm, DataStreamPtr & stream)
{
	const int K_Version = 0;

	int iVersion;
	int iVertexCount;
	int iIndexCount;
	int iVertexElems;

	stream->Read(&iVersion, sizeof(int));

	d_assert (iVersion == K_SubMesh_Version || iVersion == K_SubMesh_Version_1);

	stream->Read(&iVertexCount, sizeof(int));
	stream->Read(&iIndexCount, sizeof(int));
	stream->Read(&iVertexElems, sizeof(int));

	int iPrimitiveCount = iIndexCount / 3;
	int iPrimitiveType = PRIM_TRIANGLELIST;

	d_assert (iVertexElems | VE_POSITION);

	sm->GetVertexStream()->SetCount(iVertexCount);
	sm->GetIndexStream()->SetCount(iIndexCount);
	sm->SetPrimitiveCount(iPrimitiveCount);
	sm->SetPrimitiveType((PRIMITIVE_TYPE)iPrimitiveType);

	VertexDeclarationPtr decl = VideoBufferManager::Instance()->CreateVertexDeclaration();
	
	int vstride = GenVertexDecl(decl, iVertexElems);

	VertexBufferPtr vb = VideoBufferManager::Instance()->CreateVertexBuffer(vstride * iVertexCount, vstride);

	void * vdata = vb->Lock(0, 0, LOCK_NORMAL);
	{
		stream->Read(vdata, vstride * iVertexCount);
	}
	vb->Unlock();

	bool index16 = true;
	if (iIndexCount > 65535)
		index16 = false;

	int istride = index16 ? 2 : 4;
	IndexBufferPtr ib = VideoBufferManager::Instance()->CreateIndexBuffer(istride * iIndexCount, index16);

	void * idata = ib->Lock(0, 0, LOCK_NORMAL);
	{
		stream->Read(idata, istride * iIndexCount);
	}
	ib->Unlock();

	sm->GetVertexStream()->SetDeclaration(decl);
	sm->GetVertexStream()->Bind(0, vb, vstride);
	sm->GetIndexStream()->Bind(ib, 0);

	if (iVersion >= K_SubMesh_Version_1)
	{
		Array<short> & boneMap = sm->GetBoneIdMap();

		int numBoneMap = 0;

		stream->Read(&numBoneMap, sizeof(int));

		if (numBoneMap > 0 && numBoneMap < MAX_BLEND_MATRIX_VS)
		{
			boneMap.Resize(numBoneMap);

			stream->Read(&boneMap[0], sizeof(short) * numBoneMap);
		}
	}

	ReadMaterial(sm, stream);
}
Пример #14
0
void MeshLoader_v0::ReadSubMesh(SubMesh * sm, DataStreamPtr & stream)
{
    int iVertexCount;
    int iIndexCount;
    int iPrimitiveCount;
    int iPrimitiveType;
    String sMaterial;

    stream->Read(&iVertexCount, sizeof(int));
    stream->Read(&iIndexCount, sizeof(int));
    stream->Read(&iPrimitiveCount, sizeof(int));
    stream->Read(&iPrimitiveType, sizeof(int));

    sm->GetVertexStream()->SetCount(iVertexCount);
    sm->GetIndexStream()->SetCount(iIndexCount);
    sm->SetPrimitiveCount(iPrimitiveCount);
    sm->SetPrimitiveType((PRIMITIVE_TYPE)iPrimitiveType);

    stream->ReadString(sMaterial);
    //sm->SetMaterialName(sMaterial.c_str());

    VertexDeclarationPtr decl = VideoBufferManager::Instance()->CreateVertexDeclaration();
    sm->GetVertexStream()->SetDeclaration(decl);

    //read sub chunk
    chunk ck;
    while (ReadChunk(ck, stream) &&
           (ck.id == MC_SUBMESH_TRANSFROM_STREAM ||
            ck.id == MC_SUBMESH_LIGHT_STREAM ||
            ck.id == MC_SUBMESH_TEXCOORD_STREAM ||
            ck.id == MC_SUBMESH_ANIMATION_STREAM ||
            ck.id == MC_SUBMESH_INDEX_STREAM))
    {
        switch (ck.id)
        {
        case MC_SUBMESH_TRANSFROM_STREAM:
            debug_assert(sm->GetVertexStream()->GetStream(_GEOM_STREAM).IsNull(), "model file error.");
            ReadTransStream(sm, stream);
            break;

        case MC_SUBMESH_LIGHT_STREAM:
            debug_assert(sm->GetVertexStream()->GetStream(_LIGHT_STREAM).IsNull(), "model file error.");
            ReadLightStream(sm, stream);
            break;

        case MC_SUBMESH_TEXCOORD_STREAM:
            debug_assert(sm->GetVertexStream()->GetStream(_TEXC_STREAM).IsNull(), "model file error.");
            ReadTexcStream(sm, stream);
            break;

        case MC_SUBMESH_ANIMATION_STREAM:
            debug_assert(sm->GetVertexStream()->GetStream(_ANIM_STREAM).IsNull(), "model file error.");
            ReadAnimStream(sm, stream);
            break;

        case MC_SUBMESH_INDEX_STREAM:
            debug_assert(sm->GetIndexStream()->GetStream().IsNull(), "model file error.");
            ReadIndexStream(sm, stream);
            break;
        }
    }

    decl->Init();

    d_assert(sm->GetVertexStream()->GetStream(_GEOM_STREAM).NotNull());

    //skip
    if (!stream->Eof())
        stream->Skip(-MC_CHUNK_SIZE);
}