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

📄 mobmodel.cpp

📁 Torus3D.rar,BREW平台的3D游戏引擎的一个实例.喜欢的朋友可以下载
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		m_pTexCoords[v[2]*2+1] = FTOX(V);

		U += dU;
	}

//	if (bUseUVHack)
	{
		for (x=0; x < m_dwVertexCount; x++)
		{
			// more accurate V mapping
			m_pTexCoords[x*2+1] = FTOX(1 - (XTOF(m_pVertices[x*3+1])+fRadius) / (fRadius*2));

			// scale height down
			//m_pVertices[x*3+1] = (int)(m_pVertices[x*3+1] * 0.9f);
		}
	}

	#if INC_NORMALS
		RecalculateNormals();
	#endif
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
#if INC_NORMALS

	#if 1

		//
		// Fixed-Point method for normals recalculation
		//
		void CMobModel::RecalculateNormals(void)
		{
			unsigned int n;
			word* wUsedCount;
			int*	pNormals;
			wUsedCount = (word*)MALLOC(sizeof(word)*m_dwVertexCount);
			if (!wUsedCount) return;
			pNormals = (int*)MALLOC(sizeof(int)*(m_dwVertexCount*3));
			if (!pNormals)
			{
				API_FREE(wUsedCount);
				return;
			}

			MEMSET(wUsedCount, 0, m_dwVertexCount);
			MEMSET(pNormals, 0, m_dwVertexCount*3);

			vec3_t vNormal;
			VectorSet(vNormal, 0,0,0);

			for (n=0; n<m_dwFaceCount; n++)
			{
				//
				// recalculate face normal
				//

				int i = n*3;
				dword vidx[3] = { m_pFaces[i+0],m_pFaces[i+1],m_pFaces[i+2] };
				TriNormal(&m_pVertices[vidx[0]*3], &m_pVertices[vidx[1]*3], &m_pVertices[vidx[2]*3], vNormal);

				//
				// updates the referenced vertexes normals
				//

				pNormals[vidx[0]*3+0] += vNormal[0];
				pNormals[vidx[0]*3+1] += vNormal[1];
				pNormals[vidx[0]*3+2] += vNormal[2];

				pNormals[vidx[1]*3+0] += vNormal[0];
				pNormals[vidx[1]*3+1] += vNormal[1];
				pNormals[vidx[1]*3+2] += vNormal[2];

				pNormals[vidx[2]*3+0] += vNormal[0];
				pNormals[vidx[2]*3+1] += vNormal[1];
				pNormals[vidx[2]*3+2] += vNormal[2];

				wUsedCount[vidx[0]]++;
				wUsedCount[vidx[1]]++;
				wUsedCount[vidx[2]]++;
			}

			for (n=0; n<m_dwVertexCount; n++)
			{
				dword idx = n * 3;
				m_pNormals[idx+0] = FPDFP(pNormals[idx+0], ITOX(wUsedCount[n]));
				m_pNormals[idx+1] = FPDFP(pNormals[idx+1], ITOX(wUsedCount[n]));
				m_pNormals[idx+2] = FPDFP(pNormals[idx+2], ITOX(wUsedCount[n]));
			}

			FREE(wUsedCount);
			FREE(pNormals);
		}

	#else

		//
		// Floating-Point method for normals recalculation
		//
		void CMobModel::RecalculateNormals(void)
		{
			unsigned int n;
			word* wUsedCount;
			float*	pNormals;
			wUsedCount = (word*)MALLOC(sizeof(word)*m_dwVertexCount);
			if (!wUsedCount) return;
			pNormals = (float*)MALLOC(sizeof(float)*(m_dwVertexCount*3));
			if (!pNormals)
			{
				API_FREE(wUsedCount);
				return;
			}

			MEMSET(wUsedCount, 0, m_dwVertexCount);
			MEMSET(pNormals, 0, m_dwVertexCount*3);

			vec3f_t vNormal;
			VectorSet(vNormal, 0,0,0);

			for (n=0; n<m_dwFaceCount; n++)
			{
				//
				// recalculate face normal
				//

				int i = n*3;
				dword vidx[3] = { m_pFaces[i+0],m_pFaces[i+1],m_pFaces[i+2] };
				vec3f_t v[3] =
				{
					{ XTOF(m_pVertices[vidx[0]*3]), XTOF(m_pVertices[vidx[0]*3+1]), XTOF(m_pVertices[vidx[0]*3+2]) },
					{ XTOF(m_pVertices[vidx[1]*3]), XTOF(m_pVertices[vidx[1]*3+1]), XTOF(m_pVertices[vidx[1]*3+2]) },
					{ XTOF(m_pVertices[vidx[2]*3]), XTOF(m_pVertices[vidx[2]*3+1]), XTOF(m_pVertices[vidx[2]*3+2]) }
				};
				TriNormalf(v[0], v[1], v[2], vNormal);

				//
				// updates the referenced vertexes normals
				//

				pNormals[vidx[0]*3+0] += vNormal[0];
				pNormals[vidx[0]*3+1] += vNormal[1];
				pNormals[vidx[0]*3+2] += vNormal[2];

				pNormals[vidx[1]*3+0] += vNormal[0];
				pNormals[vidx[1]*3+1] += vNormal[1];
				pNormals[vidx[1]*3+2] += vNormal[2];

				pNormals[vidx[2]*3+0] += vNormal[0];
				pNormals[vidx[2]*3+1] += vNormal[1];
				pNormals[vidx[2]*3+2] += vNormal[2];

				wUsedCount[vidx[0]]++;
				wUsedCount[vidx[1]]++;
				wUsedCount[vidx[2]]++;
			}

			for (n=0; n<m_dwVertexCount; n++)
			{
				dword idx = n * 3;
				m_pNormals[idx+0] = FTOX(pNormals[idx+0] / wUsedCount[n]);
				m_pNormals[idx+1] = FTOX(pNormals[idx+1] / wUsedCount[n]);
				m_pNormals[idx+2] = FTOX(pNormals[idx+2] / wUsedCount[n]);
			}

			FREE(wUsedCount);
			FREE(pNormals);
		}

	#endif

#endif


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
void CMobModel::SetZWrite(boolean bZWrite)
{
	m_bZWrite = bZWrite;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
boolean CMobModel::ZWrite()
{
	return m_bZWrite;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
void CMobModel::SetBackCull(boolean bBackCull)
{
	m_bBackCull = bBackCull;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
boolean CMobModel::BackCull()
{
	return m_bBackCull;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
dword CMobModel::BSphere()
{
	return m_dwBSphere;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
int* CMobModel::BBMin()
{
	return m_BBMin;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
int* CMobModel::BBMax()
{
	return m_BBMax;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
int* CMobModel::Vertices()
{
	return m_pVertices;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
int* CMobModel::Vertex(dword dwVertex)
{
	return &m_pVertices[dwVertex*3];
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
word* CMobModel::Faces()
{
	return m_pFaces;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
dword* CMobModel::Colors()
{
	return m_pColors;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
dword* CMobModel::TexCoords()
{
	return m_pTexCoords;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
dword CMobModel::VertexCount()
{
	return m_dwVertexCount;
}


// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
dword CMobModel::FaceCount()
{
	return m_dwFaceCount;
}


#if INC_NORMALS
	// ----------------------------------------------------------------------------------------------------------
	//
	//
	//
	// ----------------------------------------------------------------------------------------------------------
	int* CMobModel::Normals()
	{
		return m_pNormals;
	}

	#if INC_ENVMAP
		// ----------------------------------------------------------------------------------------------------------
		//
		//
		//
		// ----------------------------------------------------------------------------------------------------------
		int* CMobModel::EnvNormals()
		{
			return m_pEnvNormals;
		}

		// ----------------------------------------------------------------------------------------------------------
		//
		//
		//
		// ----------------------------------------------------------------------------------------------------------
		dword* CMobModel::EnvTexCoords()
		{
			return m_pEnvTexCoords;
		}
	#endif
#endif

⌨️ 快捷键说明

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