source: golgotha/src/golg/map_collision.cc @ 80

Last change on this file since 80 was 80, checked in by Sam Hocevar, 12 years ago
  • Adding the Golgotha source code. Not sure what's going to be interesting in there, but since it's all public domain, there's certainly stuff to pick up.
File size: 6.4 KB
Line 
1/********************************************************************** <BR>
2  This file is part of Crack dot Com's free source code release of
3  Golgotha. <a href="http://www.crack.com/golgotha_release"> <BR> for
4  information about compiling & licensing issues visit this URL</a>
5  <PRE> If that doesn't help, contact Jonathan Clark at
6  golgotha_source@usa.net (Subject should have "GOLG" in it)
7***********************************************************************/
8
9#include "map.hh"
10#include "g1_object.hh"
11#include "height_info.hh"
12#include "map_cell.hh"
13
14
15// int g1_map_class::check_collision(i4_float x, i4_float y,
16//                                      i4_float occupancy_radius,
17//                                      i4_float &dx, i4_float &dy,
18//                                      sw32 _ix, sw32 _iy,
19//                                      g1_object_class*& hit) const
20// {
21//   i4_float gx,gy,r;
22//   i4_float a,b,c,d,e;
23
24//   hit = 0;
25//   i4_float min_dist=0;
26
27//   sw32 x_left,x_right,y_top,y_bottom,ix,iy;
28 
29//   if (
30//       (cell(_ix,_iy)->is_blocking()) ||
31//       (x<0)    || (y<0)    || (x>=w)    || (y>=h) ||
32//       (x+dx<0) || (y+dy<0) || (x+dx>=w) || (y+dy>=h)
33//      )
34//   {
35//     //dx = 0;
36//     //dy = 0;
37//     return -1;
38//   }
39
40//   x_left   = i4_f_to_i(x - fabs(dx)); if (x_left<0)     x_left=0;
41//   x_right  = i4_f_to_i(x + fabs(dx)); if (x_right>w-1)  x_right=w-1;
42//   y_top    = i4_f_to_i(y - fabs(dy)); if (y_top<0)      y_top=0;
43//   y_bottom = i4_f_to_i(y + fabs(dy)); if (y_bottom>h-1) y_bottom=h-1;
44
45
46//   for (ix=x_left; ix<=x_right;  ix++)
47//   for (iy=y_top;  iy<=y_bottom; iy++)
48//   {
49//     if (ix>=0 && iy>=0 && ix<w && iy<h)
50//     {
51//       g1_object_chain_class *p = cell(ix,iy)->get_solid_list();
52//       while (p)
53//       {   
54//         //if its an exact collision (exactly same x's and y's) its probably the same object,
55//         //so ignore it
56//         if (p->object->x!=x || p->object->y!=y)
57//         {
58
59//           gx = p->object->x - x;
60//           gy = p->object->y - y;               
61
62//           a  = dx*gx + dy*gy;
63//           b  = dx*dx + dy*dy;               
64//           c  = (a*a)/b;
65       
66//           d  = gx*gx + gy*gy;
67//           r  = p->object->occupancy_radius();
68
69//           if ((r*r)>d-c)
70//           {     
71//             i4_bool x_check=i4_F,y_check=i4_F;
72//             //min_dist=d;
73//             if (dx>0)
74//             {
75//               if ((p->object->x+r > x) && (p->object->x-r < (x+dx))) x_check = i4_T;
76//             }
77//             else
78//             {
79//               if ((p->object->x-r < x) && (p->object->x+r > (x+dx))) x_check = i4_T;
80//             }
81     
82//             if (dy>0)
83//             {
84//               if ((p->object->y+r > y) && (p->object->y-r < (y+dy))) y_check = i4_T;
85//             }
86//             else
87//             {
88//               if ((p->object->y-r < y) && (p->object->y+r > (y+dy))) y_check = i4_T;
89//             }
90
91//             if (x_check && y_check)
92//               hit =p->object;
93//           }
94//         }
95//         p = p->next_solid();
96//       }
97//     }
98//   }
99 
100//   if (hit)
101//     return 1;
102 
103//   return 0;
104// }
105
106int g1_map_class::check_non_player_collision(g1_player_type player_num,
107                                             const i4_3d_vector &point,
108                                             i4_3d_vector &ray,
109                                             g1_object_class*& hit) const
110{
111  hit = 0;
112
113  sw32 x_left,x_right,y_top,y_bottom, ix,iy;
114
115  if ((point.x<0) || (point.y<0) || (point.x>=w) || (point.y>=h) ||
116      (point.x+ray.x<0) || (point.y+ray.y<0) || (point.x+ray.x>=w) || (point.y+ray.y>=h))
117  {
118    ray.x=0;
119    ray.y=0;
120    ray.z=0;
121    return -1;
122  }
123
124  i4_3d_vector final(point);
125  final += ray;
126  i4_float height = terrain_height(final.x,final.y);
127  if (final.z<height)
128  {
129    // hit the ground
130    ray.z = height - point.z;
131    return 1;
132  }
133
134  if (ray.x<0)
135  {
136    x_left   = i4_f_to_i(point.x + ray.x);
137    x_right  = i4_f_to_i(point.x);
138  }
139  else
140  {
141    x_left   = i4_f_to_i(point.x);
142    x_right  = i4_f_to_i(point.x + ray.x);
143  }
144  if (ray.y<0)
145  {
146    y_top    = i4_f_to_i(point.y + ray.y);
147    y_bottom = i4_f_to_i(point.y);
148  }
149  else
150  {
151    y_top    = i4_f_to_i(point.y);
152    y_bottom = i4_f_to_i(point.y + ray.y);
153  }
154
155  if (x_left<0)     x_left=0;   
156  if (x_right>w-1)  x_right=w-1;
157  if (y_top<0)      y_top=0;     
158  if (y_bottom>h-1) y_bottom=h-1;
159
160  for (ix=x_left; ix<=x_right;  ix++)
161    for (iy=y_top;  iy<=y_bottom; iy++)
162    {
163      g1_object_chain_class *p = cell(ix,iy)->get_solid_list();
164
165      while (p)
166      {
167        // if the object is not on our team or so not dangerous (probably a building)
168        if ((p->object->player_num!=player_num ||
169             !p->object->get_flag(g1_object_class::DANGEROUS)) &&
170            p->object->check_collision(point, ray))
171          hit = p->object;
172       
173        p = p->next_solid();
174      }
175    }
176 
177  if (hit)
178    return 1;
179 
180  return 0;
181}
182
183
184// int g1_map_class::check_cell(i4_float x, i4_float y,
185//                              i4_float occupancy_radius,
186//                              sw32 ix, sw32 iy) const
187// {
188//   i4_float dx, dy, r;
189
190//   if (!cell(ix,iy).get_solid_list())
191//     return 1;
192//   return 0;
193// }
194
195
196int g1_map_class::check_terrain_location(i4_float x, i4_float y, i4_float z,
197                                         i4_float rad, w8 grade, w8 dir) const
198{
199  i4_float x_left,x_right,y_top,y_bottom;
200 
201  x_left   = x - rad; if (x_left<0)    return 0;
202  x_right  = x + rad; if (x_right>=w)  return 0;
203  y_top    = y - rad; if (y_top<0)     return 0;
204  y_bottom = y + rad; if (y_bottom>=h) return 0;
205
206  sw32 xl = i4_f_to_i(x_left);
207  sw32 xr = i4_f_to_i(x_right);
208  sw32 yt = i4_f_to_i(y_top);
209  sw32 yb = i4_f_to_i(y_bottom);
210
211  g1_map_cell_class *c;
212//   const g1_block_map_class *block = get_block_map(grade);
213
214//   c = &cell(xl,yt);
215
216//   if (c->is_blocking() || block->is_blocked(xl,yt,dir)) return 0;
217
218//   c = &cell(xr,yt);
219
220//   if (c->is_blocking() || block->is_blocked(xr,yt,dir)) return 0; 
221
222//   c = &cell(xl,yb);
223
224//   if (c->is_blocking() || block->is_blocked(xl,yb,dir)) return 0;
225 
226//   c = &cell(xr,yb);
227
228//   if (c->is_blocking() || block->is_blocked(xr,yb,dir)) return 0;
229 
230  return 1;
231}
Note: See TracBrowser for help on using the repository browser.