- procedure FindQuads(index:longint);
- var i,c:longint;
- begin
- c := 0;
- for i := 0 to High(EditHighmapDlg.VertexArray) do
- begin
- if (EditHighmapDlg.VertexArray[i][0] = EditHighmapDlg.VertexArray[index][0])
- and (EditHighmapDlg.VertexArray[i][1] = EditHighmapDlg.VertexArray[index][1])
- and (EditHighmapDlg.VertexArray[i][2] = EditHighmapDlg.VertexArray[index][2]) then
- c := c + 1;
- end;
- SetLength(num_v,c);
- c := 0;
- for i := 0 to High(EditHighmapDlg.VertexArray) do
- begin
- if i <> index then
- if (EditHighmapDlg.VertexArray[i][0] = EditHighmapDlg.VertexArray[index][0])
- and (EditHighmapDlg.VertexArray[i][1] = EditHighmapDlg.VertexArray[index][1])
- and (EditHighmapDlg.VertexArray[i][2] = EditHighmapDlg.VertexArray[index][2]) then
- begin
- num_v[c] := i;
- inc(c);
- end;
- end;
- end;
- ...
- SetLength(norms,(High(EditHighmapDlg.VertexArray) div 4));
- for i := 0 to (High(EditHighmapDlg.VertexArray) div 4) do
- begin
- norm := FindNormal(newmesh.groups[0].vertices[i*4].x,
- newmesh.groups[0].vertices[i*4].y,
- newmesh.groups[0].vertices[i*4].z,
- newmesh.groups[0].vertices[i*4+1].x,
- newmesh.groups[0].vertices[i*4+1].y,
- newmesh.groups[0].vertices[i*4+1].z,
- newmesh.groups[0].vertices[i*4+2].x,
- newmesh.groups[0].vertices[i*4+2].y,
- newmesh.groups[0].vertices[i*4+2].z);
- norms[i][0] := norm[1];
- norms[i][1] := norm[2];
- norms[i][2] := norm[3];
- end;
- apos := 0;
- for i := 0 to High(EditHighmapDlg.VertexArray) do
- begin
- if i mod 4 = 0 then inc(apos);
- FindQuads(i);
- if length(num_v) = 1 then
- begin
- newmesh.groups[0].vertices[i].nx := norms[apos][0];
- newmesh.groups[0].vertices[i].ny := norms[apos][1];
- newmesh.groups[0].vertices[i].nz := norms[apos][2];
- end
- else
- begin
- norm[1] := 0;
- norm[2] := 0;
- norm[3] := 0;
- for j := 0 to length(num_v)-1 do
- begin
- temp := FindNormal(newmesh.groups[0].vertices[num_v[j]].x,
- newmesh.groups[0].vertices[num_v[j]].y,
- newmesh.groups[0].vertices[num_v[j]].z,
- newmesh.groups[0].vertices[num_v[j]+1].x,
- newmesh.groups[0].vertices[num_v[j]+1].y,
- newmesh.groups[0].vertices[num_v[j]+1].z,
- newmesh.groups[0].vertices[num_v[j]+2].x,
- newmesh.groups[0].vertices[num_v[j]+2].y,
- newmesh.groups[0].vertices[num_v[j]+2].z);
- norm[1] := norm[1] + temp[1];
- norm[2] := norm[2] + temp[2];
- norm[3] := norm[3] + temp[3];
- end;
- norm[1] := norm[1] / length(num_v);
- norm[2] := norm[2] / length(num_v);
- norm[3] := norm[3] / length(num_v);
- newmesh.groups[0].vertices[i].nx := norm[1];
- newmesh.groups[0].vertices[i].ny := norm[2];
- newmesh.groups[0].vertices[i].nz := norm[3];
- end;
- Application.ProcessMessages;
- end;