#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); }