Original Post
I am creating a lit 2D tiling map in D3D. Basically, my basic tile is a 6 vert square that is 16x16. I fill the buffer with 2 for loops, each screen is 58x38 squares. The vb is dynamic, I discard and refill the buffer on map scroll. The problem is, the normal data is not correct. I have debugged it, and the processes and most of the data seems correct, except the normal data just will not change. I am calculating the face normals of the triangles, then averaging them. I thinking that I must be doing something fundementally wrong, because I cant find the error in the code. Forgive me for the data dump, here is some code. Any help would be very valuable :)
/////////////////
//VERTEX_SQUARE//
/////////////////
//The structure I use the keep height data
class VERTEX_SQUARE
{
public:
//Vertex height data
float v0,v1,v2,v3,v4,v5;
//Vertice vectors
//Vertex 0
D3DVECTOR vec0;
D3DVECTOR vec1;
D3DVECTOR vec2;
D3DVECTOR vec3;
D3DVECTOR vec4;
D3DVECTOR vec5;
//Normal faces
D3DVECTOR triangle0;
D3DVECTOR triangle1;
//Vertex normal values stored in vector
D3DVECTOR normals0;
D3DVECTOR normals1;
D3DVECTOR normals2;
D3DVECTOR normals3;
D3DVECTOR normals4;
D3DVECTOR normals5;
//Surrounding square normals
D3DVECTOR nw,n,ne;
D3DVECTOR w,e;
D3DVECTOR sw,s,se;
};
/////////////////
//VERTEX_SQUARE//
/////////////////
////////////////////
//Init_vb_main_map//
////////////////////
int RENDER_CLASS::Init_vb_main_map()
{
//Setup D3D_VERTEX pointer
D3D_VERTEX* Vertex = NULL;
int offset_x = 0;
int offset_y = 0;
int x_ = -512;
int y_ = 384;
int wrld_x = g_Dx_Obj.pos_x_axis; //Starting map position,used for height array
int wrld_y = g_Dx_Obj.pos_y_axis; //Starting map position,used for height array
//Lock the vertex buffer
vb_main_map->Lock(0,0 * sizeof(D3D_VERTEX),(void**)&Vertex,D3DLOCK_DISCARD);
//Fill map buffer
for(int y = 0; y < 12768; y+=336)
{
for(int x = 0; x < 336; x+=6)
{
//Compute the face normals for the triangles
//Triangle 0
Terrain_Data.Height_Map[wrld_x][wrld_y].triangle0 =
g_Dx_Obj.ComputeFaceNormals(Terrain_Data.Height_Map[wrld_x][wrld_y].vec0,
Terrain_Data.Height_Map[wrld_x][wrld_y].vec1,
Terrain_Data.Height_Map[wrld_x][wrld_y].vec2);
//Triangle 1
Terrain_Data.Height_Map[wrld_x][wrld_y].triangle1 =
g_Dx_Obj.ComputeFaceNormals(Terrain_Data.Height_Map[wrld_x][wrld_y].vec3,
Terrain_Data.Height_Map[wrld_x][wrld_y].vec4,
Terrain_Data.Height_Map[wrld_x][wrld_y].vec5);
//Find the average normal from surrounding squares
//Vertex 0
Terrain_Data.Height_Map[wrld_x][wrld_y].normals0 =
g_Dx_Obj.ComputeVertexNormal(3,Terrain_Data.Height_Map[wrld_x][wrld_y].w,
Terrain_Data.Height_Map[wrld_x][wrld_y].sw,
Terrain_Data.Height_Map[wrld_x][wrld_y].s);
//Vertex 1
Terrain_Data.Height_Map[wrld_x][wrld_y].normals1 =
g_Dx_Obj.ComputeVertexNormal(3,Terrain_Data.Height_Map[wrld_x][wrld_y].nw,
Terrain_Data.Height_Map[wrld_x][wrld_y].n,
Terrain_Data.Height_Map[wrld_x][wrld_y].w);
//Vertex 2
Terrain_Data.Height_Map[wrld_x][wrld_y].normals2 =
g_Dx_Obj.ComputeVertexNormal(3,Terrain_Data.Height_Map[wrld_x][wrld_y].n,
Terrain_Data.Height_Map[wrld_x][wrld_y].ne,
Terrain_Data.Height_Map[wrld_x][wrld_y].e);
//Vertex 3
Terrain_Data.Height_Map[wrld_x][wrld_y].normals3 =
g_Dx_Obj.ComputeVertexNormal(3,Terrain_Data.Height_Map[wrld_x][wrld_y].w,
Terrain_Data.Height_Map[wrld_x][wrld_y].sw,
Terrain_Data.Height_Map[wrld_x][wrld_y].s);
//Vertex 4
Terrain_Data.Height_Map[wrld_x][wrld_y].normals4 =
g_Dx_Obj.ComputeVertexNormal(3,Terrain_Data.Height_Map[wrld_x][wrld_y].n,
Terrain_Data.Height_Map[wrld_x][wrld_y].ne,
Terrain_Data.Height_Map[wrld_x][wrld_y].e);
//Vertex 5
Terrain_Data.Height_Map[wrld_x][wrld_y].normals5 =
g_Dx_Obj.ComputeVertexNormal(3,Terrain_Data.Height_Map[wrld_x][wrld_y].w,
Terrain_Data.Height_Map[wrld_x][wrld_y].sw,
Terrain_Data.Height_Map[wrld_x][wrld_y].s);
//Update vertex 0, triangle 0
Vertex[y+x+0].x = (0 + offset_x + x_);
Vertex[y+x+0].y = (-16 + offset_y + y_);
Vertex[y+x+0].z = Terrain_Data.Height_Map[wrld_x][wrld_y].v0;
Vertex[y+x+0].nx = Terrain_Data.Height_Map[wrld_x][wrld_y].normals0.x;
Vertex[y+x+0].ny = Terrain_Data.Height_Map[wrld_x][wrld_y].normals0.y;
Vertex[y+x+0].nz = Terrain_Data.Height_Map[wrld_x][wrld_y].normals0.z;
Vertex[y+x+0].u = 0;
Vertex[y+x+0].v = 1;
//Put vector data in height map
Terrain_Data.Height_Map[wrld_x][wrld_y].vec0.x = Vertex[y+x+0].x;
Terrain_Data.Height_Map[wrld_x][wrld_y].vec0.y = Vertex[y+x+0].y;
Terrain_Data.Height_Map[wrld_x][wrld_y].vec0.z = Vertex[y+x+0].z;
//----------------------------------------------------------------
//Update vertex 1, triangle 0
Vertex[y+x+1].x = (0 + offset_x + x_);
Vertex[y+x+1].y = (0 + offset_y + y_);
Vertex[y+x+1].z = Terrain_Data.Height_Map[wrld_x][wrld_y].v1;
Vertex[y+x+1].nx = Terrain_Data.Height_Map[wrld_x][wrld_y].normals1.x;
Vertex[y+x+1].ny = Terrain_Data.Height_Map[wrld_x][wrld_y].normals1.y;
Vertex[y+x+1].nz = Terrain_Data.Height_Map[wrld_x][wrld_y].normals1.z;
Vertex[y+x+1].u = 0;
Vertex[y+x+1].v = 0;
//Put vector data in height map
Terrain_Data.Height_Map[wrld_x][wrld_y].vec1.x = Vertex[y+x+1].x;
Terrain_Data.Height_Map[wrld_x][wrld_y].vec1.y = Vertex[y+x+1].y;
Terrain_Data.Height_Map[wrld_x][wrld_y].vec1.z = Vertex[y+x+1].z;
//----------------------------------------------------------------
//Update vertex 2, triangle 0
Vertex[y+x+2].x = (16 + offset_x + x_);
Vertex[y+x+2].y = (0 + offset_y + y_);
Vertex[y+x+2].z = Terrain_Data.Height_Map[wrld_x][wrld_y].v2;
Vertex[y+x+2].nx = Terrain_Data.Height_Map[wrld_x][wrld_y].normals2.x;
Vertex[y+x+2].ny = Terrain_Data.Height_Map[wrld_x][wrld_y].normals2.y;
Vertex[y+x+2].nz = Terrain_Data.Height_Map[wrld_x][wrld_y].normals2.z;
Vertex[y+x+2].u = 1;
Vertex[y+x+2].v = 0;
//Put vector data in height map
Terrain_Data.Height_Map[wrld_x][wrld_y].vec2.x = Vertex[y+x+2].x;
Terrain_Data.Height_Map[wrld_x][wrld_y].vec2.y = Vertex[y+x+2].y;
Terrain_Data.Height_Map[wrld_x][wrld_y].vec2.z = Vertex[y+x+2].z;
//----------------------------------------------------------------
//Update vertex 3, triangle 1
Vertex[y+x+3].x = (0 + offset_x + x_);
Vertex[y+x+3].y = (-16 + offset_y + y_);
Vertex[y+x+3].z = Terrain_Data.Height_Map[wrld_x][wrld_y].v3;
Vertex[y+x+3].nx = Terrain_Data.Height_Map[wrld_x][wrld_y].normals3.x;
Vertex[y+x+3].ny = Terrain_Data.Height_Map[wrld_x][wrld_y].normals3.y;
Vertex[y+x+3].nz = Terrain_Data.Height_Map[wrld_x][wrld_y].normals3.z;
Vertex[y+x+3].u = 0;
Vertex[y+x+3].v = 1;
//Put vector data in height map
Terrain_Data.Height_Map[wrld_x][wrld_y].vec3.x = Vertex[y+x+3].x;
Terrain_Data.Height_Map[wrld_x][wrld_y].vec3.y = Vertex[y+x+3].y;
Terrain_Data.Height_Map[wrld_x][wrld_y].vec3.z = Vertex[y+x+3].z;
//----------------------------------------------------------------
//Update vertex 4, triangle 1
Vertex[y+x+4].x = (16 + offset_x + x_);
Vertex[y+x+4].y = (0 + offset_y + y_);
Vertex[y+x+4].z = Terrain_Data.Height_Map[wrld_x][wrld_y].v4;
Vertex[y+x+4].nx = Terrain_Data.Height_Map[wrld_x][wrld_y].normals4.x;
Vertex[y+x+4].ny = Terrain_Data.Height_Map[wrld_x][wrld_y].normals4.y;
Vertex[y+x+4].nz = Terrain_Data.Height_Map[wrld_x][wrld_y].normals4.z;
Vertex[y+x+4].u = 1;
Vertex[y+x+4].v = 0;
//Put vector data in height map
Terrain_Data.Height_Map[wrld_x][wrld_y].vec4.x = Vertex[y+x+4].x;
Terrain_Data.Height_Map[wrld_x][wrld_y].vec4.y = Vertex[y+x+4].y;
Terrain_Data.Height_Map[wrld_x][wrld_y].vec4.z = Vertex[y+x+4].z;
//----------------------------------------------------------------
//Update vertex 5, triangle 1
Vertex[y+x+5].x = (16 + offset_x + x_);
Vertex[y+x+5].y = (-16 + offset_y + y_);
Vertex[y+x+5].z = Terrain_Data.Height_Map[wrld_x][wrld_y].v5;
Vertex[y+x+5].nx = Terrain_Data.Height_Map[wrld_x][wrld_y].normals5.x;
Vertex[y+x+5].ny = Terrain_Data.Height_Map[wrld_x][wrld_y].normals5.y;
Vertex[y+x+5].nz = Terrain_Data.Height_Map[wrld_x][wrld_y].normals5.z;
Vertex[y+x+5].u = 1;
Vertex[y+x+5].v = 1;
//Put vector data in height map
Terrain_Data.Height_Map[wrld_x][wrld_y].vec5.x = Vertex[y+x+5].x;
Terrain_Data.Height_Map[wrld_x][wrld_y].vec5.y = Vertex[y+x+5].y;
Terrain_Data.Height_Map[wrld_x][wrld_y].vec5.z = Vertex[y+x+5].z;
//----------------------------------------------------------------
//Update loop variables
offset_x += 16;
++wrld_x;
}//end x for
//Update loop variables
offset_x = 0;
offset_y -= 16;
++wrld_y;
wrld_x = g_Dx_Obj.pos_x_axis;
}//end y for
//Unlock the vertex buffer
vb_main_map->Unlock();
return(1);
}
////////////////////////
//End Init_vb_main_map//
////////////////////////