home *** CD-ROM | disk | FTP | other *** search
- /********************************************************************
- FILENAME: VIEW_UT.CPP
- AUTHOR : JAKE HILL
- DATE : 12/1/94
-
- Copyright (c) 1994 by Jake Hill:
- If you use any part of this code in your own project, please credit
- me in your documentation and source code. Thanks.
- ********************************************************************/
-
- #include "VIEW.HPP"
- #include "TRIG.HPP"
-
-
- // This function returns TRUE it the player is on the right
- // of the node indexed by node_num.
- char View::OnRight( short node_num )
- {
- node *ThisNode = PNode_Array[node_num];
- long x1 = ThisNode->x;
- long y1 = ThisNode->y;
- long x2 = x1 + ThisNode->dx;
- long y2 = y1 + ThisNode->dy;
-
- if ( ((x1-x2)*(Py-y2)) >= ((y1-y2)*(Px-x2)) )
- return 1;
- return 0;
- };
-
- // This function returns TRUE it the player is on the right
- // of the line segment created by the vertexes indexed by from, and to.
- char View::OnRight(short from, short to)
- {
- vertex *Vertex = &Vertex_Array[from];
- long x1 = Vertex->x;
- long y1 = Vertex->y;
- Vertex = &Vertex_Array[to];
- long x2 = Vertex->x;
- long y2 = Vertex->y;
-
- if ( ((x1-x2)*(Py-y2)) >= ((y1-y2)*(Px-x2)) )
- return 1;
- return 0;
- };
-
- // Note concerning LeftSideInCone & RightSideInCone.
- // These functions are based on the quadrants that the
- // view cone intersects. The minimum resolution is an
- // entire quadrant. This is not very accurate, and therefore
- // does not cull out as many nodes as would be ideal, but it
- // is a quick and dirty method that is fairly effective.
- // It could DEFINATELY be improved upon.
-
- // This function returns TRUE if the LEFT Child Node
- // of the node indexed by node_num is in the view cone.
- char View::LeftSideInCone( short node_num )
- {
- if ( LeftAngle < 0x4000 )
- {
- if ( PNode_Array[node_num]->lx2 > Px ) return 1;
- }
- else if ( LeftAngle < 0x8000 )
- {
- if ( PNode_Array[node_num]->ly2 > Py ) return 1;
- }
- else if ( LeftAngle < 0xC000 )
- {
- if ( PNode_Array[node_num]->lx1 < Px ) return 1;
- }
- else
- {
- if ( PNode_Array[node_num]->ly1 < Py ) return 1;
- }
-
- return 0;
- };
-
- // This function returns TRUE if the RIGHT Child Node
- // of the node indexed by node_num is in the view cone.
- char View::RightSideInCone( short node_num )
- {
- if ( LeftAngle < 0x4000 )
- {
- if ( PNode_Array[node_num]->rx2 > Px ) return 1;
- }
- else if ( LeftAngle < 0x8000 )
- {
- if ( PNode_Array[node_num]->ry2 > Py ) return 1;
- }
- else if ( LeftAngle < 0xC000 )
- {
- if ( PNode_Array[node_num]->rx1 < Px ) return 1;
- }
- else
- {
- if ( PNode_Array[node_num]->ry1 < Py ) return 1;
- }
-
- return 0;
- };
-
- // This function sets the view's x,y, height, and angle values.
- void View::SetView(short x, short y, short h, unsigned short a)
- {
- Px = x;
- Py = y;
- Ph = h;
- Pangle = a;
- LeftAngle = Pangle + 0x2000;
- SinPangle = sine( 0x00-Pangle );
- CosPangle = cosine( 0x00-Pangle );
- };
-
- // This function returns the view's x,y height and angle values.
- void View::GetView(short *x, short *y, short *h, unsigned short *a)
- {
- *x = Px;
- *y = Py;
- *h = Ph;
- *a = Pangle;
- };
-