24 #ifdef OPC_RAYHIT_CALLBACK
39 static void AllContacts(
const CollisionFace& hit,
void* user_data)
47 collider.SetHitCallback(Local::AllContacts);
48 collider.SetUserData(&contacts);
56 static void ClosestContact(
const CollisionFace& hit,
void* user_data)
64 collider.SetHitCallback(Local::ClosestContact);
65 collider.SetUserData(&closest_contact);
70 bool Opcode::SetupShadowFeeler(
RayCollider& collider)
73 collider.SetHitCallback(
null);
80 collider.SetHitCallback(
null);
88 float min_dist,
float max_dist,
const Point& view_point, CullModeCallback callback,
void* user_data)
96 CullModeCallback Callback;
103 static void RenderCullingCallback(
const CollisionFace& hit,
void* user_data)
105 CullData* Data = (CullData*)user_data;
108 if(hit.
mDistance>=Data->Closest->mDistance)
return;
113 if(hit.
mDistance<=Data->MinLimit)
return;
122 CullMode CM = (Data->Callback)(StabbedFaceIndex, Data->UserData);
124 if(CM!=CULLMODE_NONE)
129 Data->IMesh->GetTriangle(VP, StabbedFaceIndex);
132 if(CM==CULLMODE_CW) KeepIt =
false;
136 if(CM==CULLMODE_CCW) KeepIt =
false;
140 if(KeepIt) *Data->Closest = hit;
149 RC.SetHitCallback(Local::RenderCullingCallback);
153 picked_face.
mU = 0.0f;
154 picked_face.
mV = 0.0f;
156 Local::CullData Data;
157 Data.Closest = &picked_face;
158 Data.MinLimit = min_dist;
159 Data.Callback = callback;
160 Data.UserData = user_data;
161 Data.ViewPoint = view_point;
171 Data.ViewPoint *= InvWorld;
174 RC.SetUserData(&Data);
175 if(RC.
Collide(world_ray, model, world))