X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
Revision | 80 (tree) |
---|---|
Zeit | 2015-05-04 22:58:34 |
Autor | xops-mikan |
ブロックの繋ぎ目から落ちる場合がある問題の修正(例:WAREHOUSE_DEF)、コンソール入力時のバグ修正
@@ -35,26 +35,16 @@ | ||
35 | 35 | Collision::Collision() |
36 | 36 | { |
37 | 37 | blockdata = NULL; |
38 | - bdata_polygon_center_x = new float[MAX_BLOCKS * 6]; | |
39 | - bdata_polygon_center_y = new float[MAX_BLOCKS * 6]; | |
40 | - bdata_polygon_center_z = new float[MAX_BLOCKS * 6]; | |
41 | - bmin_x = new float[MAX_BLOCKS]; | |
42 | - bmin_y = new float[MAX_BLOCKS]; | |
43 | - bmin_z = new float[MAX_BLOCKS]; | |
44 | - bmax_x = new float[MAX_BLOCKS]; | |
45 | - bmax_y = new float[MAX_BLOCKS]; | |
46 | - bmax_z = new float[MAX_BLOCKS]; | |
47 | - BoardBlock = new bool[MAX_BLOCKS]; | |
48 | - bdata_worldgroup = new int[MAX_BLOCKS]; | |
38 | + cbdata = new Coll_Blockdata[MAX_BLOCKS]; | |
49 | 39 | for(int i=0; i<MAX_BLOCKS; i++){ |
50 | - bmin_x[i] = 0.0f; | |
51 | - bmin_y[i] = 0.0f; | |
52 | - bmin_z[i] = 0.0f; | |
53 | - bmax_x[i] = 0.0f; | |
54 | - bmax_y[i] = 0.0f; | |
55 | - bmax_z[i] = 0.0f; | |
56 | - BoardBlock[i] = false; | |
57 | - bdata_worldgroup[i] = 0; | |
40 | + cbdata[i].min_x = 0.0f; | |
41 | + cbdata[i].min_y = 0.0f; | |
42 | + cbdata[i].min_z = 0.0f; | |
43 | + cbdata[i].max_x = 0.0f; | |
44 | + cbdata[i].max_y = 0.0f; | |
45 | + cbdata[i].max_z = 0.0f; | |
46 | + cbdata[i].BoardBlock = false; | |
47 | + cbdata[i].worldgroup = 0; | |
58 | 48 | } |
59 | 49 | } |
60 | 50 |
@@ -61,17 +51,7 @@ | ||
61 | 51 | //! @brief ディストラクタ |
62 | 52 | Collision::~Collision() |
63 | 53 | { |
64 | - if( bdata_polygon_center_x != NULL ){ delete [] bdata_polygon_center_x; } | |
65 | - if( bdata_polygon_center_y != NULL ){ delete [] bdata_polygon_center_y; } | |
66 | - if( bdata_polygon_center_z != NULL ){ delete [] bdata_polygon_center_z; } | |
67 | - if( bmin_x != NULL ){ delete [] bmin_x; } | |
68 | - if( bmin_y != NULL ){ delete [] bmin_y; } | |
69 | - if( bmin_z != NULL ){ delete [] bmin_z; } | |
70 | - if( bmax_x != NULL ){ delete [] bmax_x; } | |
71 | - if( bmax_y != NULL ){ delete [] bmax_y; } | |
72 | - if( bmax_z != NULL ){ delete [] bmax_z; } | |
73 | - if( BoardBlock != NULL ){ delete [] BoardBlock; } | |
74 | - if( bdata_worldgroup != NULL ){ delete [] bdata_worldgroup; } | |
54 | + if( cbdata != NULL ){ delete [] cbdata; } | |
75 | 55 | } |
76 | 56 | |
77 | 57 | //! @brief ブロックデータを取り込む |
@@ -88,42 +68,77 @@ | ||
88 | 68 | bs = blockdata->GetTotaldatas(); |
89 | 69 | |
90 | 70 | for(int i=0; i<bs; i++){ |
91 | - BoardBlock[i] = false; | |
71 | + cbdata[i].BoardBlock = false; | |
92 | 72 | } |
93 | 73 | |
74 | + for(int i=0; i<bs; i++){ | |
75 | + float cx = 0.0f; | |
76 | + float cy = 0.0f; | |
77 | + float cz = 0.0f; | |
78 | + float x, y, z, rx, ry, r; | |
79 | + | |
80 | + blockdata->Getdata(&data, i); | |
81 | + | |
82 | + //中心を求める | |
83 | + for(int j=0; j<8; j++){ | |
84 | + cx += data.x[j]; | |
85 | + cy += data.y[j]; | |
86 | + cz += data.z[j]; | |
87 | + } | |
88 | + cx /= 8; | |
89 | + cy /= 8; | |
90 | + cz /= 8; | |
91 | + | |
92 | + //各頂点の座標を再計算 | |
93 | + for(int j=0; j<8; j++){ | |
94 | + //中心からの位置関係を算出 | |
95 | + x = data.x[j] - cx; | |
96 | + y = data.y[j] - cy; | |
97 | + z = data.z[j] - cz; | |
98 | + rx = atan2(z, x); | |
99 | + ry = atan2(y, sqrt(x*x + z*z)); | |
100 | + r = sqrt(x*x + y*y + z*z); | |
101 | + | |
102 | + //大きくする | |
103 | + r += 0.1f; | |
104 | + | |
105 | + //座標を再計算 | |
106 | + cbdata[i].x[j] = cx + cos(rx) * cos(ry) * r; | |
107 | + cbdata[i].y[j] = cy + sin(ry) * r; | |
108 | + cbdata[i].z[j] = cz + sin(rx) * cos(ry) * r; | |
109 | + } | |
110 | + } | |
111 | + | |
94 | 112 | //判定用平面の中心点算出 |
95 | 113 | for(int i=0; i<bs; i++){ |
96 | - blockdata->Getdata(&data, i); | |
97 | 114 | for(int j=0; j<6; j++){ |
98 | 115 | blockdataface(j, &vID[0], NULL); |
99 | 116 | |
100 | - bdata_polygon_center_x[i*6 + j] = 0.0f; | |
101 | - bdata_polygon_center_y[i*6 + j] = 0.0f; | |
102 | - bdata_polygon_center_z[i*6 + j] = 0.0f; | |
117 | + cbdata[i].polygon_center_x[j] = 0.0f; | |
118 | + cbdata[i].polygon_center_y[j] = 0.0f; | |
119 | + cbdata[i].polygon_center_z[j] = 0.0f; | |
103 | 120 | |
104 | 121 | //4頂点の中心点を算出 |
105 | 122 | for(int k=0; k<4; k++){ |
106 | - bdata_polygon_center_x[i*6 + j] += data.x[ vID[k] ]; | |
107 | - bdata_polygon_center_y[i*6 + j] += data.y[ vID[k] ]; | |
108 | - bdata_polygon_center_z[i*6 + j] += data.z[ vID[k] ]; | |
123 | + cbdata[i].polygon_center_x[j] += cbdata[i].x[ vID[k] ]; | |
124 | + cbdata[i].polygon_center_y[j] += cbdata[i].y[ vID[k] ]; | |
125 | + cbdata[i].polygon_center_z[j] += cbdata[i].z[ vID[k] ]; | |
109 | 126 | } |
110 | - bdata_polygon_center_x[i*6 + j] /= 4; | |
111 | - bdata_polygon_center_y[i*6 + j] /= 4; | |
112 | - bdata_polygon_center_z[i*6 + j] /= 4; | |
127 | + cbdata[i].polygon_center_x[j] /= 4; | |
128 | + cbdata[i].polygon_center_y[j] /= 4; | |
129 | + cbdata[i].polygon_center_z[j] /= 4; | |
113 | 130 | } |
114 | 131 | } |
115 | 132 | |
116 | 133 | //板状のブロックを検出 |
117 | 134 | for(int i=0; i<bs; i++){ |
118 | - blockdata->Getdata(&data, i); | |
135 | + cbdata[i].BoardBlock = false; | |
119 | 136 | |
120 | - BoardBlock[i] = false; | |
121 | - | |
122 | 137 | for(int j=0; j<8; j++){ |
123 | 138 | for(int k=j+1; k<8; k++){ |
124 | 139 | //一ヵ所でも頂点が同じなら、板状になっていると判定。 |
125 | - if( (data.x[j] == data.x[k])&&(data.y[j] == data.y[k])&&(data.z[j] == data.z[k]) ){ | |
126 | - BoardBlock[i] = true; | |
140 | + if( (cbdata[i].x[j] == cbdata[i].x[k])&&(cbdata[i].y[j] == cbdata[i].y[k])&&(cbdata[i].z[j] == cbdata[i].z[k]) ){ | |
141 | + cbdata[i].BoardBlock = true; | |
127 | 142 | j = 8; k = 8; //break |
128 | 143 | } |
129 | 144 | } |
@@ -134,9 +149,9 @@ | ||
134 | 149 | float my = 0.0f; |
135 | 150 | float mz = 0.0f; |
136 | 151 | for(int j=0; j<8; j++){ |
137 | - mx += data.x[j]; | |
138 | - my += data.y[j]; | |
139 | - mz += data.z[j]; | |
152 | + mx += cbdata[i].x[j]; | |
153 | + my += cbdata[i].y[j]; | |
154 | + mz += cbdata[i].z[j]; | |
140 | 155 | } |
141 | 156 | mx /= 8; |
142 | 157 | my /= 8; |
@@ -145,7 +160,7 @@ | ||
145 | 160 | //ブロックの中心点に対して1面でも表面ならば、板状になっていると判定。 |
146 | 161 | for(int j=0; j<6; j++){ |
147 | 162 | if( CheckPolygonFront(i, j, mx, my, mz) == true ){ |
148 | - BoardBlock[i] = true; | |
163 | + cbdata[i].BoardBlock = true; | |
149 | 164 | break; |
150 | 165 | } |
151 | 166 | } |
@@ -154,21 +169,15 @@ | ||
154 | 169 | |
155 | 170 | //ブロックAABB作成 |
156 | 171 | for(int i=0; i<bs; i++){ |
157 | - blockdata->Getdata(&data, i); | |
158 | - GetBlockPosMINMAX(data, &bmin_x[i], &bmin_y[i], &bmin_z[i], &bmax_x[i], &bmax_y[i], &bmax_z[i]); | |
172 | + GetBlockPosMINMAX(i, &cbdata[i].min_x, &cbdata[i].min_y, &cbdata[i].min_z, &cbdata[i].max_x, &cbdata[i].max_y, &cbdata[i].max_z); | |
159 | 173 | } |
160 | 174 | |
161 | 175 | //ブロックの空間分割グループを計算 |
162 | 176 | for(int i=0; i<bs; i++){ |
163 | - ///* | |
164 | - blockdata->Getdata(&data, i); | |
165 | - | |
166 | - bdata_worldgroup[i] = GetWorldGroup(bmin_x[i], bmin_z[i]); | |
167 | - if( GetWorldGroup(bmax_x[i], bmax_z[i]) != bdata_worldgroup[i] ){ | |
168 | - bdata_worldgroup[i] = 0; | |
177 | + cbdata[i].worldgroup = GetWorldGroup(cbdata[i].min_x, cbdata[i].min_z); | |
178 | + if( GetWorldGroup(cbdata[i].max_x, cbdata[i].max_z) != cbdata[i].worldgroup ){ | |
179 | + cbdata[i].worldgroup = 0; | |
169 | 180 | } |
170 | - //*/ | |
171 | - //bdata_worldgroup[i] = 0; | |
172 | 181 | } |
173 | 182 | |
174 | 183 | return 0; |
@@ -175,7 +184,7 @@ | ||
175 | 184 | } |
176 | 185 | |
177 | 186 | //! @brief ブロックの座標最大値・最小値を返す |
178 | -//! @param data ブロックデータの構造体 | |
187 | +//! @param id 判定するブロック番号 | |
179 | 188 | //! @param *min_x 最小 X座標を返すポインタ |
180 | 189 | //! @param *min_y 最小 Y座標を返すポインタ |
181 | 190 | //! @param *min_z 最小 Z座標を返すポインタ |
@@ -182,22 +191,22 @@ | ||
182 | 191 | //! @param *max_x 最大 X座標を返すポインタ |
183 | 192 | //! @param *max_y 最大 Y座標を返すポインタ |
184 | 193 | //! @param *max_z 最大 Z座標を返すポインタ |
185 | -void Collision::GetBlockPosMINMAX(struct blockdata data, float *min_x, float *min_y, float *min_z, float *max_x, float *max_y, float *max_z) | |
194 | +void Collision::GetBlockPosMINMAX(int id, float *min_x, float *min_y, float *min_z, float *max_x, float *max_y, float *max_z) | |
186 | 195 | { |
187 | - *min_x = data.x[0]; | |
188 | - *min_y = data.y[0]; | |
189 | - *min_z = data.z[0]; | |
190 | - *max_x = data.x[0]; | |
191 | - *max_y = data.y[0]; | |
192 | - *max_z = data.z[0]; | |
196 | + *min_x = cbdata[id].x[0]; | |
197 | + *min_y = cbdata[id].y[0]; | |
198 | + *min_z = cbdata[id].z[0]; | |
199 | + *max_x = cbdata[id].x[0]; | |
200 | + *max_y = cbdata[id].y[0]; | |
201 | + *max_z = cbdata[id].z[0]; | |
193 | 202 | for(int i=1; i<8; i++){ |
194 | - if( *min_x > data.x[i] ){ *min_x = data.x[i]; } | |
195 | - if( *min_y > data.y[i] ){ *min_y = data.y[i]; } | |
196 | - if( *min_z > data.z[i] ){ *min_z = data.z[i]; } | |
203 | + if( *min_x > cbdata[id].x[i] ){ *min_x = cbdata[id].x[i]; } | |
204 | + if( *min_y > cbdata[id].y[i] ){ *min_y = cbdata[id].y[i]; } | |
205 | + if( *min_z > cbdata[id].z[i] ){ *min_z = cbdata[id].z[i]; } | |
197 | 206 | |
198 | - if( *max_x < data.x[i] ){ *max_x = data.x[i]; } | |
199 | - if( *max_y < data.y[i] ){ *max_y = data.y[i]; } | |
200 | - if( *max_z < data.z[i] ){ *max_z = data.z[i]; } | |
207 | + if( *max_x < cbdata[id].x[i] ){ *max_x = cbdata[id].x[i]; } | |
208 | + if( *max_y < cbdata[id].y[i] ){ *max_y = cbdata[id].y[i]; } | |
209 | + if( *max_z < cbdata[id].z[i] ){ *max_z = cbdata[id].z[i]; } | |
201 | 210 | } |
202 | 211 | |
203 | 212 | //計算誤差対策のため、わずかに大きめにする。 |
@@ -245,9 +254,9 @@ | ||
245 | 254 | blockdata->Getdata(&bdata, id); |
246 | 255 | |
247 | 256 | //面の中心を基準点に、座標のベクトルを求める |
248 | - vx = bdata_polygon_center_x[id*6 + face] - x; | |
249 | - vy = bdata_polygon_center_y[id*6 + face] - y; | |
250 | - vz = bdata_polygon_center_z[id*6 + face] - z; | |
257 | + vx = cbdata[id].polygon_center_x[face] - x; | |
258 | + vy = cbdata[id].polygon_center_y[face] - y; | |
259 | + vz = cbdata[id].polygon_center_z[face] - z; | |
251 | 260 | |
252 | 261 | //内積 |
253 | 262 | d = bdata.material[face].vx*vx + bdata.material[face].vy*vy + bdata.material[face].vz*vz; |
@@ -322,9 +331,9 @@ | ||
322 | 331 | } |
323 | 332 | |
324 | 333 | //面の中心を基準点に、座標のベクトルを求める |
325 | - vx1 = RayPos_x - bdata_polygon_center_x[blockid*6 + face]; | |
326 | - vy1 = RayPos_y - bdata_polygon_center_y[blockid*6 + face]; | |
327 | - vz1 = RayPos_z - bdata_polygon_center_z[blockid*6 + face]; | |
334 | + vx1 = RayPos_x - cbdata[blockid].polygon_center_x[face]; | |
335 | + vy1 = RayPos_y - cbdata[blockid].polygon_center_y[face]; | |
336 | + vz1 = RayPos_z - cbdata[blockid].polygon_center_z[face]; | |
328 | 337 | |
329 | 338 | //内積 |
330 | 339 | d2 = data.material[face].vx*vx1 + data.material[face].vy*vy1 + data.material[face].vz*vz1; //面までの最短距離が求まる |
@@ -337,9 +346,9 @@ | ||
337 | 346 | |
338 | 347 | |
339 | 348 | //ブロック全体のAABBに入らなければ除外 |
340 | - if( (x < bmin_x[blockid])||(bmax_x[blockid] < x) ){ return false; } | |
341 | - if( (y < bmin_y[blockid])||(bmax_y[blockid] < y) ){ return false; } | |
342 | - if( (z < bmin_z[blockid])||(bmax_z[blockid] < z) ){ return false; } | |
349 | + if( (x < cbdata[blockid].min_x)||(cbdata[blockid].max_x < x) ){ return false; } | |
350 | + if( (y < cbdata[blockid].min_y)||(cbdata[blockid].max_y < y) ){ return false; } | |
351 | + if( (z < cbdata[blockid].min_z)||(cbdata[blockid].max_z < z) ){ return false; } | |
343 | 352 | |
344 | 353 | |
345 | 354 | //以下、ブロック面の内側に交点があるかチェック |
@@ -417,7 +426,7 @@ | ||
417 | 426 | if( (blockid < 0)||(blockdata->GetTotaldatas() <= blockid) ){ return false; } |
418 | 427 | |
419 | 428 | //板状のブロックは計算外 |
420 | - if( BoardBlock[blockid] == true ){ return false; } | |
429 | + if( cbdata[blockid].BoardBlock == true ){ return false; } | |
421 | 430 | |
422 | 431 | |
423 | 432 | //判定の荒削り |
@@ -424,13 +433,13 @@ | ||
424 | 433 | if( worldgroup == true ){ |
425 | 434 | |
426 | 435 | //空間分割 |
427 | - if( bdata_worldgroup[blockid] != 0 ){ | |
436 | + if( cbdata[blockid].worldgroup != 0 ){ | |
428 | 437 | //観測点の空間のグループを取得 |
429 | 438 | int worldgroup = GetWorldGroup(x, z); |
430 | 439 | |
431 | 440 | if( worldgroup != 0 ){ |
432 | 441 | //空間のグループが違えば計算外 |
433 | - if( bdata_worldgroup[blockid] != worldgroup ){ | |
442 | + if( cbdata[blockid].worldgroup != worldgroup ){ | |
434 | 443 | return false; |
435 | 444 | } |
436 | 445 | } |
@@ -437,9 +446,9 @@ | ||
437 | 446 | } |
438 | 447 | |
439 | 448 | //範囲で検索 |
440 | - if( (x < bmin_x[blockid])||(bmax_x[blockid] < x) ){ return false; } | |
441 | - if( (y < bmin_y[blockid])||(bmax_y[blockid] < y) ){ return false; } | |
442 | - if( (z < bmin_z[blockid])||(bmax_z[blockid] < z) ){ return false; } | |
449 | + if( (x < cbdata[blockid].min_x)||(cbdata[blockid].max_x < x) ){ return false; } | |
450 | + if( (y < cbdata[blockid].min_y)||(cbdata[blockid].max_y < y) ){ return false; } | |
451 | + if( (z < cbdata[blockid].min_z)||(cbdata[blockid].max_z < z) ){ return false; } | |
443 | 452 | } |
444 | 453 | |
445 | 454 |
@@ -506,7 +515,7 @@ | ||
506 | 515 | int worldgroupB = 0; |
507 | 516 | |
508 | 517 | //板状のブロックは計算外 |
509 | - if( BoardBlock[blockid] == true ){ | |
518 | + if( cbdata[blockid].BoardBlock == true ){ | |
510 | 519 | if( face != NULL ){ *face = 0; } |
511 | 520 | *Dist = 0.0f; |
512 | 521 | return false; |
@@ -535,14 +544,14 @@ | ||
535 | 544 | } |
536 | 545 | |
537 | 546 | if( maxDist > 0.0f ){ |
538 | - if( bdata_worldgroup[blockid] != 0 ){ | |
547 | + if( cbdata[blockid].worldgroup != 0 ){ | |
539 | 548 | //始点と終点が、空間のグループから出ていなければ |
540 | 549 | if( (worldgroupA != 0)&&(worldgroupA == worldgroupB) ){ |
541 | 550 | |
542 | 551 | //空間のグループが違えば計算外 |
543 | - if( bdata_worldgroup[blockid] == worldgroupA ){ //worldgroupA == worldgroupB | |
552 | + if( cbdata[blockid].worldgroup == worldgroupA ){ //worldgroupA == worldgroupB | |
544 | 553 | //境界ボックス同士で判定 |
545 | - if( CollideBoxAABB(bmin_x[blockid], bmin_y[blockid], bmin_z[blockid], bmax_x[blockid], bmax_y[blockid], bmax_z[blockid], rmin_x, rmin_y, rmin_z, rmax_x, rmax_y, rmax_z) == false ){ | |
554 | + if( CollideBoxAABB(cbdata[blockid].min_x, cbdata[blockid].min_y, cbdata[blockid].min_z, cbdata[blockid].max_x, cbdata[blockid].max_y, cbdata[blockid].max_z, rmin_x, rmin_y, rmin_z, rmax_x, rmax_y, rmax_z) == false ){ | |
546 | 555 | //当たってなければ、このブロックは調べない。 |
547 | 556 | if( face != NULL ){ *face = 0; } |
548 | 557 | *Dist = 0.0f; |
@@ -554,7 +563,7 @@ | ||
554 | 563 | } |
555 | 564 | |
556 | 565 | //境界ボックスとレイで判定 |
557 | - if( CollideAABBRay(bmin_x[blockid], bmin_y[blockid], bmin_z[blockid], bmax_x[blockid], bmax_y[blockid], bmax_z[blockid], RayPos_x, RayPos_y, RayPos_z, RayDir_x, RayDir_y, RayDir_z, NULL, -1.0f) == false ){ | |
566 | + if( CollideAABBRay(cbdata[blockid].min_x, cbdata[blockid].min_y, cbdata[blockid].min_z, cbdata[blockid].max_x, cbdata[blockid].max_y, cbdata[blockid].max_z, RayPos_x, RayPos_y, RayPos_z, RayDir_x, RayDir_y, RayDir_z, NULL, -1.0f) == false ){ | |
558 | 567 | //当たってなければ、このブロックは調べない。 |
559 | 568 | if( face != NULL ){ *face = 0; } |
560 | 569 | *Dist = 0.0f; |
@@ -645,18 +654,18 @@ | ||
645 | 654 | |
646 | 655 | for(int i=0; i<bs; i++){ |
647 | 656 | //板状のブロックは計算外 |
648 | - if( BoardBlock[i] == true ){ continue; } | |
657 | + if( cbdata[i].BoardBlock == true ){ continue; } | |
649 | 658 | |
650 | 659 | if( maxDist > 0.0f ){ |
651 | - if( bdata_worldgroup[i] != 0 ){ | |
660 | + if( cbdata[i].worldgroup != 0 ){ | |
652 | 661 | //始点と終点が、空間のグループから出ていなければ |
653 | 662 | if( (worldgroupA != 0)&&(worldgroupA == worldgroupB) ){ |
654 | 663 | |
655 | 664 | //空間のグループが違えば計算外 |
656 | - if( bdata_worldgroup[i] == worldgroupA ){ //worldgroupA == worldgroupB | |
665 | + if( cbdata[i].worldgroup == worldgroupA ){ //worldgroupA == worldgroupB | |
657 | 666 | |
658 | 667 | //境界ボックス同士で判定 |
659 | - if( CollideBoxAABB(bmin_x[i], bmin_y[i], bmin_z[i], bmax_x[i], bmax_y[i], bmax_z[i], rmin_x, rmin_y, rmin_z, rmax_x, rmax_y, rmax_z) == false ){ | |
668 | + if( CollideBoxAABB(cbdata[i].min_x, cbdata[i].min_y, cbdata[i].min_z, cbdata[i].max_x, cbdata[i].max_y, cbdata[i].max_z, rmin_x, rmin_y, rmin_z, rmax_x, rmax_y, rmax_z) == false ){ | |
660 | 669 | continue; //当たってなければ、このブロックは調べない。 |
661 | 670 | } |
662 | 671 |
@@ -666,7 +675,7 @@ | ||
666 | 675 | } |
667 | 676 | |
668 | 677 | //境界ボックスとレイで判定 |
669 | - if( CollideAABBRay(bmin_x[i], bmin_y[i], bmin_z[i], bmax_x[i], bmax_y[i], bmax_z[i], RayPos_x, RayPos_y, RayPos_z, RayDir_x, RayDir_y, RayDir_z, NULL, -1.0f) == false ){ | |
678 | + if( CollideAABBRay(cbdata[i].min_x, cbdata[i].min_y, cbdata[i].min_z, cbdata[i].max_x, cbdata[i].max_y, cbdata[i].max_z, RayPos_x, RayPos_y, RayPos_z, RayDir_x, RayDir_y, RayDir_z, NULL, -1.0f) == false ){ | |
670 | 679 | continue; //当たってなければ、このブロックは調べない。 |
671 | 680 | } |
672 | 681 |
@@ -85,7 +85,7 @@ | ||
85 | 85 | //! コンソールを管理する構造体 |
86 | 86 | struct ConsoleData{ |
87 | 87 | int color; //!< 色 |
88 | - char textdata[MAX_CONSOLELEN]; //!< 文字列 | |
88 | + char textdata[MAX_CONSOLELEN+1]; //!< 文字列 | |
89 | 89 | }; |
90 | 90 | #endif |
91 | 91 |
@@ -39,22 +39,30 @@ | ||
39 | 39 | |
40 | 40 | #include <float.h> |
41 | 41 | |
42 | +//! 当たり判定用ブロックデータ構造体 | |
43 | +struct Coll_Blockdata{ | |
44 | + float x[8]; //!< ブロック X座標 | |
45 | + float y[8]; //!< ブロック Y座標 | |
46 | + float z[8]; //!< ブロック Z座標 | |
47 | + float polygon_center_x[6]; //!< ブロックの面の中心 X座標 | |
48 | + float polygon_center_y[6]; //!< ブロックの面の中心 Y座標 | |
49 | + float polygon_center_z[6]; //!< ブロックの面の中心 Z座標 | |
50 | + float min_x; //!< ブロック X座標の最小値 | |
51 | + float min_y; //!< ブロック Y座標の最小値 | |
52 | + float min_z; //!< ブロック Z座標の最小値 | |
53 | + float max_x; //!< ブロック X座標の最大値 | |
54 | + float max_y; //!< ブロック Y座標の最大値 | |
55 | + float max_z; //!< ブロック Z座標の最大値 | |
56 | + bool BoardBlock; //!< ブロック が厚さ0で板状になっているか | |
57 | + int worldgroup; //!< 空間分割のグループ | |
58 | +}; | |
59 | + | |
42 | 60 | //! @brief 当たり判定を行うクラス |
43 | 61 | //! @details マップとして使用されるブロックデータへの当たり判定(追突検出)を行います。 |
44 | 62 | class Collision |
45 | 63 | { |
46 | 64 | class BlockDataInterface* blockdata; //!< 読み込んだブロックデータが格納されたクラスへのポインタ |
47 | - float *bdata_polygon_center_x; //!< 各ブロックの面の中心 X座標 | |
48 | - float *bdata_polygon_center_y; //!< 各ブロックの面の中心 Y座標 | |
49 | - float *bdata_polygon_center_z; //!< 各ブロックの面の中心 Z座標 | |
50 | - float *bmin_x; //!< 各ブロック X座標の最大値 | |
51 | - float *bmin_y; //!< 各ブロック Y座標の最大値 | |
52 | - float *bmin_z; //!< 各ブロック Z座標の最大値 | |
53 | - float *bmax_x; //!< 各ブロック X座標の最小値 | |
54 | - float *bmax_y; //!< 各ブロック Y座標の最小値 | |
55 | - float *bmax_z; //!< 各ブロック Z座標の最小値 | |
56 | - bool *BoardBlock; //!< 各ブロック が厚さ0で板状になっているか | |
57 | - int *bdata_worldgroup; //!< 空間分割のグループ | |
65 | + Coll_Blockdata *cbdata; //!< ブロックデータ | |
58 | 66 | |
59 | 67 | bool CheckIntersectTri(int blockid, int face, float RayPos_x, float RayPos_y, float RayPos_z, float RayDir_x, float RayDir_y, float RayDir_z, float *out_Dist); |
60 | 68 |
@@ -62,7 +70,7 @@ | ||
62 | 70 | Collision(); |
63 | 71 | ~Collision(); |
64 | 72 | int InitCollision(BlockDataInterface* in_blockdata); |
65 | - void GetBlockPosMINMAX(struct blockdata data, float *min_x, float *min_y, float *min_z, float *max_x, float *max_y, float *max_z); | |
73 | + void GetBlockPosMINMAX(int id, float *min_x, float *min_y, float *min_z, float *max_x, float *max_y, float *max_z); | |
66 | 74 | int GetWorldGroup(float x, float z); |
67 | 75 | bool CheckPolygonFront(int id, int face, float x, float y, float z); |
68 | 76 | bool CheckPolygonFrontRx(int id, int face, float rx); |
@@ -2287,7 +2287,7 @@ | ||
2287 | 2287 | BlockData.Getdata(&bdata, i); |
2288 | 2288 | |
2289 | 2289 | //表示候補のブロックを検出(荒削り) |
2290 | - CollD.GetBlockPosMINMAX(bdata, &x_min, &y_min, &z_min, &x_max, &y_max, &z_max); | |
2290 | + CollD.GetBlockPosMINMAX(i, &x_min, &y_min, &z_min, &x_max, &y_max, &z_max); | |
2291 | 2291 | if( CollideBoxAABB(x_min, y_min, z_min, x_max, y_max, z_max, camera_x-RadarWorldR*2, camera_y-1.0f, camera_z-RadarWorldR*2, camera_x+RadarWorldR*2, camera_y+1.0f, camera_z+RadarWorldR*2) == true ){ |
2292 | 2292 | |
2293 | 2293 | //各面ごとに処理する |