mirror of
https://github.com/isledecomp/isle-portable.git
synced 2025-09-23 03:55:44 -04:00
Improve MeshBuilderImpl::CreateMesh
(#1584)
* CreateMesh * Effective match for Clone()
This commit is contained in:
parent
1677193635
commit
1701117e6f
@ -866,4 +866,7 @@ inline D3DRMMATERIALMODE Translate(MaterialMode mode)
|
|||||||
// GLOBAL: LEGO1 0x100dd1e0
|
// GLOBAL: LEGO1 0x100dd1e0
|
||||||
// IID_IDirect3DRMMeshBuilder
|
// IID_IDirect3DRMMeshBuilder
|
||||||
|
|
||||||
|
// GLOBAL: LEGO1 0x100dd1f0
|
||||||
|
// IID_IDirect3DRMMesh
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -15,6 +15,7 @@ void* MeshBuilderImpl::ImplementationDataPtr()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x100a3840
|
// FUNCTION: LEGO1 0x100a3840
|
||||||
|
// FUNCTION: BETA10 0x1016ca40
|
||||||
Mesh* MeshBuilderImpl::CreateMesh(
|
Mesh* MeshBuilderImpl::CreateMesh(
|
||||||
unsigned long faceCount,
|
unsigned long faceCount,
|
||||||
unsigned long vertexCount,
|
unsigned long vertexCount,
|
||||||
@ -26,6 +27,8 @@ Mesh* MeshBuilderImpl::CreateMesh(
|
|||||||
ShadingModel shadingModel
|
ShadingModel shadingModel
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
assert(m_data);
|
||||||
|
|
||||||
MeshImpl* pMeshImpl = new MeshImpl;
|
MeshImpl* pMeshImpl = new MeshImpl;
|
||||||
if (CreateMeshImpl(
|
if (CreateMeshImpl(
|
||||||
pMeshImpl,
|
pMeshImpl,
|
||||||
@ -45,63 +48,67 @@ Mesh* MeshBuilderImpl::CreateMesh(
|
|||||||
return pMeshImpl;
|
return pMeshImpl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FUNCTION: BETA10 0x1016fef0
|
||||||
inline Result CreateMesh(
|
inline Result CreateMesh(
|
||||||
IDirect3DRMMesh* pD3DRM,
|
IDirect3DRMMesh* pD3DRM,
|
||||||
unsigned long faceCount,
|
unsigned long p_numFaces,
|
||||||
unsigned long vertexCount,
|
unsigned long p_numVertices,
|
||||||
float (*pPositions)[3],
|
float(*p_positions),
|
||||||
float (*pNormals)[3],
|
float(*p_normals),
|
||||||
float (*pTextureCoordinates)[2],
|
float(*p_textureCoordinates),
|
||||||
unsigned long (*pFaceIndices)[3],
|
unsigned long (*p_faceIndices)[3],
|
||||||
unsigned long (*pTextureIndices)[3],
|
unsigned long (*p_textureIndices)[3],
|
||||||
ShadingModel shadingModel,
|
ShadingModel shadingModel,
|
||||||
MeshImpl::MeshDataType& rpMesh
|
MeshImpl::MeshDataType& rpMesh
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
unsigned long* faceIndices = (unsigned long*) pFaceIndices;
|
unsigned short* faceIndices = (unsigned short*) p_faceIndices;
|
||||||
D3DRMGROUPINDEX groupIndex = 0;
|
D3DRMGROUPINDEX groupIndex = 0;
|
||||||
int count = faceCount * 3;
|
int faceCount = p_numFaces * 3;
|
||||||
int index = 0;
|
int count = 0;
|
||||||
|
|
||||||
unsigned int* fData = new unsigned int[count];
|
unsigned int* fData = new unsigned int[faceCount];
|
||||||
|
|
||||||
D3DRMVERTEX* vertices = new D3DRMVERTEX[vertexCount];
|
D3DRMVERTEX* vertices = new D3DRMVERTEX[p_numVertices];
|
||||||
memset(vertices, 0, sizeof(*vertices) * vertexCount);
|
memset(vertices, 0, sizeof(*vertices) * p_numVertices);
|
||||||
|
|
||||||
rpMesh = new MeshImpl::MeshData;
|
rpMesh = new MeshImpl::MeshData;
|
||||||
rpMesh->groupMesh = pD3DRM;
|
rpMesh->groupMesh = pD3DRM;
|
||||||
|
|
||||||
for (int i = 0; i < count; i++) {
|
for (int i = 0; i < faceCount; i++) {
|
||||||
if ((*((unsigned short*) &faceIndices[i] + 1) >> 0x0f) & 0x01) {
|
if (((faceIndices[2 * i + 1]) >> 0x0f) & 0x01) {
|
||||||
unsigned long j = *(unsigned short*) &faceIndices[i];
|
unsigned long j = 3 * faceIndices[2 * i];
|
||||||
vertices[index].position.x = pPositions[j][0];
|
vertices[count].position.x = p_positions[j];
|
||||||
vertices[index].position.y = pPositions[j][1];
|
vertices[count].position.y = p_positions[j + 1];
|
||||||
vertices[index].position.z = pPositions[j][2];
|
vertices[count].position.z = p_positions[j + 2];
|
||||||
j = *((unsigned short*) &faceIndices[i] + 1) & MAXSHORT;
|
|
||||||
vertices[index].normal.x = pNormals[j][0];
|
|
||||||
vertices[index].normal.y = pNormals[j][1];
|
|
||||||
vertices[index].normal.z = pNormals[j][2];
|
|
||||||
|
|
||||||
if (pTextureIndices != NULL && pTextureCoordinates != NULL) {
|
int k = 3 * (faceIndices[2 * i + 1] & MAXSHORT);
|
||||||
j = ((unsigned long*) pTextureIndices)[i];
|
vertices[count].normal.x = p_normals[k];
|
||||||
vertices[index].tu = pTextureCoordinates[j][0];
|
vertices[count].normal.y = p_normals[k + 1];
|
||||||
vertices[index].tv = pTextureCoordinates[j][1];
|
vertices[count].normal.z = p_normals[k + 2];
|
||||||
|
|
||||||
|
if (p_textureIndices != NULL && p_textureCoordinates != NULL) {
|
||||||
|
int kk = 2 * ((unsigned long*) p_textureIndices)[i];
|
||||||
|
vertices[count].tu = p_textureCoordinates[kk];
|
||||||
|
vertices[count].tv = p_textureCoordinates[kk + 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
fData[i] = index;
|
fData[i] = count;
|
||||||
index++;
|
count++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fData[i] = *(unsigned short*) &faceIndices[i];
|
fData[i] = faceIndices[2 * i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert(count == (int) p_numVertices);
|
||||||
|
|
||||||
Result result;
|
Result result;
|
||||||
result = ResultVal(pD3DRM->AddGroup(vertexCount, faceCount, 3, fData, &groupIndex));
|
result = ResultVal(pD3DRM->AddGroup(p_numVertices, p_numFaces, 3, fData, &groupIndex));
|
||||||
|
|
||||||
if (Succeeded(result)) {
|
if (Succeeded(result)) {
|
||||||
rpMesh->groupIndex = groupIndex;
|
rpMesh->groupIndex = groupIndex;
|
||||||
result = ResultVal(pD3DRM->SetVertices(groupIndex, 0, vertexCount, vertices));
|
result = ResultVal(pD3DRM->SetVertices(groupIndex, 0, p_numVertices, vertices));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Succeeded(result)) {
|
if (!Succeeded(result)) {
|
||||||
@ -112,6 +119,7 @@ inline Result CreateMesh(
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
result = MeshSetTextureMappingMode(rpMesh, PerspectiveCorrect);
|
result = MeshSetTextureMappingMode(rpMesh, PerspectiveCorrect);
|
||||||
|
assert(Succeeded(result));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fData != NULL) {
|
if (fData != NULL) {
|
||||||
@ -125,6 +133,7 @@ inline Result CreateMesh(
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FUNCTION: BETA10 0x1016fe40
|
||||||
inline Result MeshBuilderImpl::CreateMeshImpl(
|
inline Result MeshBuilderImpl::CreateMeshImpl(
|
||||||
MeshImpl* pMeshImpl,
|
MeshImpl* pMeshImpl,
|
||||||
unsigned long faceCount,
|
unsigned long faceCount,
|
||||||
@ -137,13 +146,16 @@ inline Result MeshBuilderImpl::CreateMeshImpl(
|
|||||||
ShadingModel shadingModel
|
ShadingModel shadingModel
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
assert(m_data);
|
||||||
|
assert(!pMeshImpl->ImplementationData());
|
||||||
|
|
||||||
return ::CreateMesh(
|
return ::CreateMesh(
|
||||||
m_data,
|
m_data,
|
||||||
faceCount,
|
faceCount,
|
||||||
vertexCount,
|
vertexCount,
|
||||||
pPositions,
|
reinterpret_cast<float*>(pPositions),
|
||||||
pNormals,
|
reinterpret_cast<float*>(pNormals),
|
||||||
pTextureCoordinates,
|
reinterpret_cast<float*>(pTextureCoordinates),
|
||||||
pFaceIndices,
|
pFaceIndices,
|
||||||
pTextureIndices,
|
pTextureIndices,
|
||||||
shadingModel,
|
shadingModel,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user