📄 mobmodel.cpp
字号:
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 + -