port from perforce
This commit is contained in:
84
evoke-64k/trunk/ev10/PointMapGenerator.cpp
Normal file
84
evoke-64k/trunk/ev10/PointMapGenerator.cpp
Normal file
@@ -0,0 +1,84 @@
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user