Files
bluflame/evoke-64k/trunk/ev10/PointMapGenerator.cpp
2026-04-18 22:31:51 +02:00

84 lines
2.6 KiB
C++

#include "PointMapGenerator.h"
#include "globals.h"
int PointMapGenerator::GeneratePointMap(IDirect3DVertexBuffer9* vertexBuffer, IDirect3DIndexBuffer9* indexBuffer, int vertexCount, int indexCount, int vertexStride, int positionOffset, int normalOffset, float distanceFromVertex, D3DXVECTOR4* outPointMap, int takeEveryNtVertex)
{
char* vertexData;
PMG_INDEX_FORMAT* indexData;
vertexBuffer->Lock(0, 0, (void**)&vertexData, D3DLOCK_READONLY);
indexBuffer->Lock(0, 0, (void**)&indexData, D3DLOCK_READONLY);
int pointCount = GeneratePointMap(vertexData, indexData, vertexCount, indexCount, vertexStride, positionOffset, normalOffset, distanceFromVertex, outPointMap, takeEveryNtVertex);
vertexBuffer->Unlock();
indexBuffer->Unlock();
return pointCount;
}
int PointMapGenerator::GeneratePointMap(char* vertexData, PMG_INDEX_FORMAT* indexData, int vertexCount, int indexCount, int vertexStride, int positionOffset, int normalOffset, float distanceFromVertex, D3DXVECTOR4* outPointMap, int takeEveryNtVertex)
{
int pointCount = 0;
float maxY = 0;
float minY = 0;
for (int i = 0; i < indexCount; ++i)
{
// Assertion does not hold, so what?
if ( indexData[i] >= vertexCount )
continue;
assert ( indexData[i] < vertexCount );
D3DXVECTOR3* v = (D3DXVECTOR3*)&vertexData[indexData[i] * vertexStride + positionOffset];
if (i == 0 || maxY < v->y)
{
maxY = v->y;
}
if (i == 0 || minY > v->y)
{
minY = v->y;
}
}
for (int i = 0; i < indexCount; i += takeEveryNtVertex)
{
// Assertion does not hold, so what?
if ( indexData[i] >= vertexCount )
continue;
assert ( indexData[i] < vertexCount );
D3DXVECTOR3* v = (D3DXVECTOR3*)&vertexData[indexData[i] * vertexStride + positionOffset];
D3DXVECTOR3* n = (D3DXVECTOR3*)&vertexData[indexData[i] * vertexStride + normalOffset];
D3DXVECTOR3 result = (*v) + (*n) * distanceFromVertex * g_Random.genFloat();
outPointMap[pointCount++] = D3DXVECTOR4(
result.x,
result.y,
result.z,
((v->y - minY) / (maxY - minY)) * 0.2 + g_Random.genFloat(0.0f, 0.8f));
}
return pointCount;
}
void PointMapGenerator::FillPointMap(int pointMapIndex, int objectIndex, int fluidIndex, int takeEveryNtVertex)
{
int pointCount = GeneratePointMap(
g_Objects[ objectIndex ].GetVB(),
g_Objects[ objectIndex ].GetIB(),
g_Objects[ objectIndex ].GetVertCount(),
g_Objects[ objectIndex ].GetIndexCount(),
sizeof(Renderjob::SVertex),
0,
3 * sizeof(FLOAT),
g_PointMapDistance[pointMapIndex],
g_FluidPointMap[pointMapIndex],
takeEveryNtVertex);
assert( pointCount <= 100000 );
g_FluidParticleSystem[fluidIndex] = g_FluidContext.GenerateFluidParticleSystem(pointCount * 4);
}