84 lines
2.6 KiB
C++
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);
|
|
} |