Rev 1 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1 | Rev 18 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | #include "raycast.h" |
1 | #include "raycast.h" |
2 | #include " |
2 | #include "brender.h" |
3 | #include "brucetrk.h" |
3 | #include "brucetrk.h" |
- | 4 | #include "formats.h" |
|
4 | #include "globvars.h" |
5 | #include "globvars.h" |
5 | #include "harness/trace.h" |
6 | #include "harness/trace.h" |
- | 7 | #include "shortcut.h" |
|
6 | #include <float.h> |
8 | #include <float.h> |
7 | #include <math.h> |
9 | #include <math.h> |
8 | #include <stdlib.h> |
10 | #include <stdlib.h> |
9 | 11 | ||
10 | br_matrix34 gPick_model_to_view__raycast; // suffix added to avoid duplicate symbol |
12 | br_matrix34 gPick_model_to_view__raycast; // suffix added to avoid duplicate symbol |
Line 259... | Line 261... | ||
259 | } |
261 | } |
260 | 262 | ||
261 | // IDA: int __usercall DRModelPick2D@<EAX>(br_model *model@<EAX>, br_material *material@<EDX>, br_vector3 *ray_pos@<EBX>, br_vector3 *ray_dir@<ECX>, br_scalar t_near, br_scalar t_far, dr_modelpick2d_cbfn *callback, void *arg) |
263 | // IDA: int __usercall DRModelPick2D@<EAX>(br_model *model@<EAX>, br_material *material@<EDX>, br_vector3 *ray_pos@<EBX>, br_vector3 *ray_dir@<ECX>, br_scalar t_near, br_scalar t_far, dr_modelpick2d_cbfn *callback, void *arg) |
262 | // Suffix added to avoid duplicate symbol |
264 | // Suffix added to avoid duplicate symbol |
263 | int DRModelPick2D__raycast(br_model* model, br_material* material, br_vector3* ray_pos, br_vector3* ray_dir, br_scalar t_near, br_scalar t_far, dr_modelpick2d_cbfn* callback, void* arg) { |
265 | int DRModelPick2D__raycast(br_model* model, br_material* material, br_vector3* ray_pos, br_vector3* ray_dir, br_scalar t_near, br_scalar t_far, dr_modelpick2d_cbfn* callback, void* arg) { |
264 | DR_FACE |
266 | // DR_FACE* fp; |
265 | int f; |
267 | int f; |
266 | int axis_m; |
268 | int axis_m; |
267 | int axis_0; |
269 | int axis_0; |
268 | int axis_1; |
270 | int axis_1; |
269 | int group; |
271 | int group; |
Line 291... | Line 293... | ||
291 | int r; |
293 | int r; |
292 | br_material* this_material; |
294 | br_material* this_material; |
293 | br_scalar numerator; |
295 | br_scalar numerator; |
294 | //double f_numerator; // Pierre-Marie Baty -- unused variable |
296 | //double f_numerator; // Pierre-Marie Baty -- unused variable |
295 | LOG_TRACE("(%p, %p, %p, %p, %f, %f, %p, %p)", model, material, ray_pos, ray_dir, t_near, t_far, callback, arg); |
297 | LOG_TRACE("(%p, %p, %p, %p, %f, %f, %p, %p)", model, material, ray_pos, ray_dir, t_near, t_far, callback, arg); |
- | 298 | ||
- | 299 | struct v11group* grp_ptr; |
|
- | 300 | br_vector4* eqn; |
|
296 | 301 | ||
297 | t_near -= 0.001f; |
302 | t_near -= 0.001f; |
298 | t_far += 0.001f; |
303 | t_far += 0.001f; |
299 | for (group = 0; group < V11MODEL(model)->ngroups; group++) { |
304 | for (group = 0; group < V11MODEL(model)->ngroups; group++) { |
- | 305 | grp_ptr = &V11MODEL(model)->groups[group]; |
|
300 | for (f = 0; f < V11MODEL(model)->groups[group].nfaces; f++) { |
306 | for (f = 0; f < V11MODEL(model)->groups[group].nfaces; f++) { |
301 |
|
307 | eqn = &V11MODEL(model)->groups[group].eqn[f]; |
302 | if (V11MODEL(model)->groups[group]. |
308 | if (V11MODEL(model)->groups[group].user != NULL) { |
303 | this_material = V11MODEL(model)->groups[group]. |
309 | this_material = V11MODEL(model)->groups[group].user; |
304 | } else { |
310 | } else { |
305 | this_material = material; |
311 | this_material = material; |
306 | } |
312 | } |
307 | d = BrVector3Dot( |
313 | d = BrVector3Dot(eqn, ray_dir); |
308 | if (fabsf(d) >= 0.00000023841858f && ((this_material->flags & (BR_MATF_TWO_SIDED | BR_MATF_ALWAYS_VISIBLE)) != 0 || d <= 0.0)) // |
314 | if (fabsf(d) >= 0.00000023841858f && ((this_material->flags & (BR_MATF_TWO_SIDED | BR_MATF_ALWAYS_VISIBLE)) != 0 || d <= 0.0)) // |
309 | { |
315 | { |
310 | numerator = BrVector3Dot( |
316 | numerator = BrVector3Dot(eqn, ray_pos) - eqn->v[3]; |
311 | if (!BadDiv__raycast(numerator, d)) { |
317 | if (!BadDiv__raycast(numerator, d)) { |
312 | t = -(numerator / d); |
318 | t = -(numerator / d); |
313 | if (t >= t_near && t <= t_far) { |
319 | if (t >= t_near && t <= t_far) { |
314 | BrVector3Scale(&p, ray_dir, t); |
320 | BrVector3Scale(&p, ray_dir, t); |
315 | BrVector3Accumulate(&p, ray_pos); |
321 | BrVector3Accumulate(&p, ray_pos); |
316 | axis_m = (fabsf( |
322 | axis_m = (fabsf(eqn->v[1]) > fabsf(eqn->v[0])) ? 1 : 0; |
317 | if (fabsf( |
323 | if (fabsf(eqn->v[2]) > fabsf(eqn->v[axis_m])) { |
318 | axis_m = 2; |
324 | axis_m = 2; |
319 | } |
325 | } |
320 | if (axis_m == 0) { |
326 | if (axis_m == 0) { |
321 | axis_0 = 1; |
327 | axis_0 = 1; |
322 | axis_1 = 2; |
328 | axis_1 = 2; |
Line 326... | Line 332... | ||
326 | } else if (axis_m == 2) { |
332 | } else if (axis_m == 2) { |
327 | axis_0 = 0; |
333 | axis_0 = 0; |
328 | axis_1 = 1; |
334 | axis_1 = 1; |
329 | } |
335 | } |
330 | 336 | ||
331 | v0 = |
337 | v0 = grp_ptr->position[grp_ptr->vertex_numbers[f].v[0]].v[axis_0]; |
332 | u0 = |
338 | u0 = grp_ptr->position[grp_ptr->vertex_numbers[f].v[0]].v[axis_1]; |
- | 339 | ||
333 | v1 = |
340 | v1 = grp_ptr->position[grp_ptr->vertex_numbers[f].v[1]].v[axis_0] - v0; |
334 | u1 = |
341 | u1 = grp_ptr->position[grp_ptr->vertex_numbers[f].v[1]].v[axis_1] - u0; |
335 | v2 = |
342 | v2 = grp_ptr->position[grp_ptr->vertex_numbers[f].v[2]].v[axis_0] - v0; |
336 | u2 = |
343 | u2 = grp_ptr->position[grp_ptr->vertex_numbers[f].v[2]].v[axis_1] - u0; |
337 | 344 | ||
338 | v0i1 = p.v[axis_0] - v0; |
345 | v0i1 = p.v[axis_0] - v0; |
339 | v0i2 = p.v[axis_1] - u0; |
346 | v0i2 = p.v[axis_1] - u0; |
340 | if (fabs(v1) > 0.0000002384185791015625) { |
347 | if (fabs(v1) > 0.0000002384185791015625) { |
341 | f_d = v0i2 * v1 - u1 * v0i1; |
348 | f_d = v0i2 * v1 - u1 * v0i1; |
Line 351... | Line 358... | ||
351 | } |
358 | } |
352 | 359 | ||
353 | if (alpha >= 0.0 && beta >= 0.0 && beta + alpha <= 1.0) { |
360 | if (alpha >= 0.0 && beta >= 0.0 && beta + alpha <= 1.0) { |
354 | s_alpha = alpha; |
361 | s_alpha = alpha; |
355 | s_beta = beta; |
362 | s_beta = beta; |
356 | map.v[0] = V11MODEL(model)->groups[group].vertices[fp->vertices[1]].map.v[0] * s_alpha; |
- | |
357 |
|
363 | BrVector2Scale(&map, &grp_ptr->map[grp_ptr->vertex_numbers[f].v[1]], s_alpha); |
358 | DRVector2AccumulateScale__raycast( |
364 | DRVector2AccumulateScale__raycast( |
359 | &map, |
365 | &map, |
360 | & |
366 | &grp_ptr->map[grp_ptr->vertex_numbers[f].v[2]], |
361 | s_beta); |
367 | s_beta); |
362 | DRVector2AccumulateScale__raycast( |
368 | DRVector2AccumulateScale__raycast( |
363 | &map, |
369 | &map, |
364 | & |
370 | &grp_ptr->map[grp_ptr->vertex_numbers[f].v[0]], |
365 | 1.0f - (s_alpha + s_beta)); |
371 | 1.0f - (s_alpha + s_beta)); |
366 | v = 0; |
372 | v = 0; |
367 | e = 1; |
373 | e = 1; |
368 | if (s_alpha <= s_beta) { |
374 | if (s_alpha <= s_beta) { |
369 | if (0.5f - s_beta / 2.0f > s_alpha) { |
375 | if (0.5f - s_beta / 2.0f > s_alpha) { |
Line 439... | Line 445... | ||
439 | *pNearest_y_below = gHighest_y_below; |
445 | *pNearest_y_below = gHighest_y_below; |
440 | *pNearest_above_model = gAbove_model; |
446 | *pNearest_above_model = gAbove_model; |
441 | *pNearest_below_model = gBelow_model; |
447 | *pNearest_below_model = gBelow_model; |
442 | *pNearest_above_face_index = gAbove_face_index; |
448 | *pNearest_above_face_index = gAbove_face_index; |
443 | *pNearest_below_face_index = gBelow_face_index; |
449 | *pNearest_below_face_index = gBelow_face_index; |
444 | // LOG_DEBUG("FindBestY %f %f '%s' '%s' %d %d", gLowest_y_above, gHighest_y_below, gAbove_model->identifier, gBelow_model->identifier, gAbove_face_index, gBelow_face_index); |
- | |
445 | } |
450 | } |
446 | 451 | ||
447 | // IDA: int __cdecl FindYVerticallyBelowPolyCallBack(br_model *pModel, br_material *pMaterial, br_vector3 *pRay_pos, br_vector3 *pRay_dir, br_scalar pT, int pF, int pE, int pV, br_vector3 *pPoint, br_vector2 *pMap, void *pArg) |
452 | // IDA: int __cdecl FindYVerticallyBelowPolyCallBack(br_model *pModel, br_material *pMaterial, br_vector3 *pRay_pos, br_vector3 *pRay_dir, br_scalar pT, int pF, int pE, int pV, br_vector3 *pPoint, br_vector2 *pMap, void *pArg) |
448 | int FindYVerticallyBelowPolyCallBack(br_model* pModel, br_material* pMaterial, br_vector3* pRay_pos, br_vector3* pRay_dir, br_scalar pT, int pF, int pE, int pV, br_vector3* pPoint, br_vector2* pMap, void* pArg) { |
453 | int FindYVerticallyBelowPolyCallBack(br_model* pModel, br_material* pMaterial, br_vector3* pRay_pos, br_vector3* pRay_dir, br_scalar pT, int pF, int pE, int pV, br_vector3* pPoint, br_vector2* pMap, void* pArg) { |
449 | br_scalar the_y; |
454 | br_scalar the_y; |
450 | LOG_TRACE("(%p, %p, %p, %p, %f, %d, %d, %d, %p, %p, %p)", pModel, pMaterial, pRay_pos, pRay_dir, pT, pF, pE, pV, pPoint, pMap, pArg); |
455 | LOG_TRACE("(%p, %p, %p, %p, %f, %d, %d, %d, %p, %p, %p)", pModel, pMaterial, pRay_pos, pRay_dir, pT, pF, pE, pV, pPoint, pMap, pArg); |
451 | 456 | ||
452 | if (pMaterial->identifier == NULL || pMaterial->identifier[0] != '!') { |
457 | if (pMaterial->identifier == NULL || pMaterial->identifier[0] != '!') { |
453 | the_y = pPoint->v[ |
458 | the_y = pPoint->v[Y]; |
454 | if (the_y > gHighest_y_below) { |
459 | if (the_y > gHighest_y_below) { |
455 | gHighest_y_below = the_y; |
460 | gHighest_y_below = the_y; |
456 | } |
461 | } |
457 | } |
462 | } |
458 | return 0; |
463 | return 0; |
Line 477... | Line 482... | ||
477 | tU8 z; |
482 | tU8 z; |
478 | tTrack_spec* track_spec; |
483 | tTrack_spec* track_spec; |
479 | LOG_TRACE("(%p)", pPosition); |
484 | LOG_TRACE("(%p)", pPosition); |
480 | 485 | ||
481 | track_spec = &gProgram_state.track_spec; |
486 | track_spec = &gProgram_state.track_spec; |
482 | XZToColumnXZ(&cx, &cz, pPosition->v[ |
487 | XZToColumnXZ(&cx, &cz, pPosition->v[X], pPosition->v[Z], track_spec); |
483 | gHighest_y_below = BR_SCALAR_MIN; |
488 | gHighest_y_below = BR_SCALAR_MIN; |
484 | BrVector3Copy(&gY_picking_camera->t.t.translate.t, pPosition); |
489 | BrVector3Copy(&gY_picking_camera->t.t.translate.t, pPosition); |
485 | for (x = MAX(cx - 1, 0); x < MIN(cx + 2, track_spec->ncolumns_x); x++) { |
490 | for (x = MAX(cx - 1, 0); x < MIN(cx + 2, track_spec->ncolumns_x); x++) { |
486 | for (z = MAX(cz - 1, 0); z < MIN(cz + 2, track_spec->ncolumns_z); z++) { |
491 | for (z = MAX(cz - 1, 0); z < MIN(cz + 2, track_spec->ncolumns_z); z++) { |
487 | if (track_spec->columns[z][x] != NULL) { |
492 | if (track_spec->columns[z][x] != NULL) { |
Line 506... | Line 511... | ||
506 | LOG_TRACE("(%p)", pCast_point); |
511 | LOG_TRACE("(%p)", pCast_point); |
507 | 512 | ||
508 | BrVector3Copy(&cast_point, pCast_point); |
513 | BrVector3Copy(&cast_point, pCast_point); |
509 | for (number_of_attempts = 0; number_of_attempts <= 10; number_of_attempts++) { |
514 | for (number_of_attempts = 0; number_of_attempts <= 10; number_of_attempts++) { |
510 | result = FindYVerticallyBelow(&cast_point); |
515 | result = FindYVerticallyBelow(&cast_point); |
511 | cast_point.v[ |
516 | cast_point.v[Y] += .2f; |
512 | if (result >= -100.f) { |
517 | if (result >= -100.f) { |
513 | return result; |
518 | return result; |
514 | } |
519 | } |
515 | } |
520 | } |
516 | return result; |
521 | return result; |