www.pudn.com > MY_LOD.rar > Lod.cpp
// Lod.cpp: implementation of the CLod class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MY_LOD.h"
#include "Lod.h"
#include "math.h"
#include "BMPLoad.h"
#include "LandTex.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern int quadtree[];
extern int location[];
extern int lod_lever;
extern int* y;
extern CLandTex lt;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CLod::CLod()
{
}
CLod::~CLod()
{
}
void CLod::reset_quad_tree()
{
int i;
for(i=0;i<(QUAD_MAP*QUAD_MAP);i++) {
quadtree[i]=UNKNOWN;
}
}
void CLod::setup_quadtree(int x, int z, int width)
{
int width2;
int v1[3];
v1[0]=x;
v1[2]=z;
width2=width/2;
if ((width>1)&&DISTANCE(v1,location)1) {
if(width > 16) {
glBindTexture(GL_TEXTURE_2D, lt.texture_name[(int)((x) / 64)][(int)((z) / 64)]);
}
width2=width/2;
if (quadtree[IX_QT(x,z)]==NODE_POINT) {
//NORTH
if (quadtree[IX_QT(x-width2,z-width2)]==EDGE_POINT&&
quadtree[IX_QT(x+width2,z-width2)]==EDGE_POINT) {
if (quadtree[IX_QT(x,z-2*width)]==NODE_POINT||(z-width)%MAP==0) {
draw_point(x,z,width,NORTH_L);
draw_point(x,z,width,NORTH_R);
}
else {
draw_point(x,z,width,NORTH);
}
}
else if (quadtree[IX_QT(x-width2,z-width2)]==EDGE_POINT) {
draw_point(x,z,width,NORTH_L);
}
else if (quadtree[IX_QT(x+width2,z-width2)]==EDGE_POINT) {
draw_point(x,z,width,NORTH_R);
}
//SOUTH
if (quadtree[IX_QT(x-width2,z+width2)]==EDGE_POINT&&
quadtree[IX_QT(x+width2,z+width2)]==EDGE_POINT) {
if (quadtree[IX_QT(x,z+2*width)]==NODE_POINT||(z+width)%MAP==0) {
draw_point(x,z,width,SOUTH_L);
draw_point(x,z,width,SOUTH_R);
}
else {
draw_point(x,z,width,SOUTH);
}
}
else if (quadtree[IX_QT(x-width2,z+width2)]==EDGE_POINT) {
draw_point(x,z,width,SOUTH_L);
}
else if (quadtree[IX_QT(x+width2,z+width2)]==EDGE_POINT) {
draw_point(x,z,width,SOUTH_R);
}
//EAST
if (quadtree[IX_QT(x+width2,z+width2)]==EDGE_POINT&&
quadtree[IX_QT(x+width2,z-width2)]==EDGE_POINT) {
if (quadtree[IX_QT(x+2*width,z)]==NODE_POINT||(x+width)%MAP==0) {
draw_point(x,z,width,EAST_T);
draw_point(x,z,width,EAST_B);
}
else {
draw_point(x,z,width,EAST);
}
}
else if (quadtree[IX_QT(x+width2,z-width2)]==EDGE_POINT) {
draw_point(x,z,width,EAST_T);
}
else if (quadtree[IX_QT(x+width2,z+width2)]==EDGE_POINT) {
draw_point(x,z,width,EAST_B);
}
//WEST
if (quadtree[IX_QT(x-width2,z-width2)]==EDGE_POINT&&
quadtree[IX_QT(x-width2,z+width2)]==EDGE_POINT) {
if (quadtree[IX_QT(x-2*width,z)]==NODE_POINT||(x-width)%MAP==0) {
draw_point(x,z,width,WEST_T);
draw_point(x,z,width,WEST_B);
}
else {
draw_point(x,z,width,WEST);
}
}
else if (quadtree[IX_QT(x-width2,z-width2)]==EDGE_POINT) {
draw_point(x,z,width,WEST_T);
}
else if (quadtree[IX_QT(x-width2,z+width2)]==EDGE_POINT) {
draw_point(x,z,width,WEST_B);
}
}
else {
return;
}
draw(x-width2,z-width2,width2,NW);
draw(x+width2,z-width2,width2,NE);
draw(x-width2,z+width2,width2,SW);
draw(x+width2,z+width2,width2,SE);
}
}
void CLod::draw_point(int x, int z, int width, int direction)
{
switch(direction) {
case NORTH:
if (m_bFlag)
triangle1(x,z,x+width,z-width,x-width,z-width);
else
triangle2(x,z,x+width,z-width,x-width,z-width);
break;
case SOUTH:
if (m_bFlag)
triangle1(x,z,x-width,z+width,x+width,z+width);
else
triangle2(x,z,x-width,z+width,x+width,z+width);
break;
case EAST:
if (m_bFlag)
triangle1(x,z,x+width,z+width,x+width,z-width);
else
triangle2(x,z,x+width,z+width,x+width,z-width);
break;
case WEST:
if (m_bFlag)
triangle1(x,z,x-width,z-width,x-width,z+width);
else
triangle2(x,z,x-width,z-width,x-width,z+width);
break;
case NORTH_L:
if (m_bFlag)
triangle1(x,z,x,z-width,x-width,z-width);
else
triangle2(x,z,x,z-width,x-width,z-width);
break;
case NORTH_R:
if (m_bFlag)
triangle1(x,z,x+width,z-width,x,z-width);
else
triangle2(x,z,x+width,z-width,x,z-width);
break;
case SOUTH_L:
if (m_bFlag)
triangle1(x,z,x-width,z+width,x,z+width);
else
triangle2(x,z,x-width,z+width,x,z+width);
break;
case SOUTH_R:
if (m_bFlag)
triangle1(x,z,x,z+width,x+width,z+width);
else
triangle2(x,z,x,z+width,x+width,z+width);
break;
case EAST_T:
if (m_bFlag)
triangle1(x,z,x+width,z,x+width,z-width);
else
triangle2(x,z,x+width,z,x+width,z-width);
break;
case EAST_B:
if (m_bFlag)
triangle1(x,z,x+width,z+width,x+width,z);
else
triangle2(x,z,x+width,z+width,x+width,z);
break;
case WEST_T:
if (m_bFlag)
triangle1(x,z,x-width,z-width,x-width,z);
else
triangle2(x,z,x-width,z-width,x-width,z);
break;
case WEST_B:
if (m_bFlag)
triangle1(x,z,x-width,z,x-width,z+width);
else
triangle2(x,z,x-width,z,x-width,z+width);
break;
default:
break;
}
}
void CLod::triangle1(int x1, int z1, int x2, int z2, int x3, int z3)
{
glBegin(GL_TRIANGLES);
glColor3f(1,1,1);
setVertex(x1,z1);
glColor3f(0,0,0);
setVertex(x2,z2);
glColor3f(0,0,0);
setVertex(x3,z3);
glEnd();
}
void CLod::triangle2(int x1, int z1, int x2, int z2, int x3, int z3)
{
glBegin(GL_LINE_LOOP);
setVertex(x1,z1);
setVertex(x2,z2);
setVertex(x3,z3);
glEnd();
}
void CLod::setVertex(int x, int z)
{
glVertex3f((x<