1 |
#include "Objt.h" |
2 |
#include "../Daodan.h" |
3 |
#include "../Oni_Symbols.h" |
4 |
|
5 |
void DD_OBJiTriggerVolume_Draw(OBJtObject *inObject, uint32_t inDrawFlags) |
6 |
{ |
7 |
uint32_t itr; |
8 |
OBJtOSD_All* inOSD = (OBJtOSD_All*) inObject->object_data; |
9 |
OBJtOSD_TriggerVolume *trigger_osd = &inOSD->osd.trigger_volume_osd; |
10 |
M3tPoint3D* points = trigger_osd->volume.worldPoints; |
11 |
M3tPoint3D trigger_center = MUgZeroPoint; |
12 |
uint32_t shade = 0xFFFFFF; |
13 |
UUtBool is_selected = ((inDrawFlags & OBJcDrawFlag_Selected) != 0); |
14 |
|
15 |
if (!OBJgTriggerVolume_Visible) { |
16 |
return; |
17 |
} |
18 |
|
19 |
if (OBJrTriggerVolume_IntersectsCharacter(inObject, trigger_osd->team_mask, ONgGameState->local.playerCharacter)) { |
20 |
shade = IMcShade_Red; |
21 |
} |
22 |
else if (is_selected) |
23 |
{ |
24 |
shade = IMcShade_Green; |
25 |
} |
26 |
else |
27 |
{ |
28 |
shade = IMcShade_Blue; |
29 |
} |
30 |
|
31 |
M3rGeom_Line_Light(points + 0, points + 1, shade); |
32 |
M3rGeom_Line_Light(points + 1, points + 3, shade); |
33 |
M3rGeom_Line_Light(points + 3, points + 2, shade); |
34 |
M3rGeom_Line_Light(points + 2, points + 0, shade); |
35 |
|
36 |
M3rGeom_Line_Light(points + 4, points + 5, shade); |
37 |
M3rGeom_Line_Light(points + 5, points + 7, shade); |
38 |
M3rGeom_Line_Light(points + 7, points + 6, shade); |
39 |
M3rGeom_Line_Light(points + 6, points + 4, shade); |
40 |
|
41 |
M3rGeom_Line_Light(points + 0, points + 4, shade); |
42 |
M3rGeom_Line_Light(points + 1, points + 5, shade); |
43 |
M3rGeom_Line_Light(points + 3, points + 7, shade); |
44 |
M3rGeom_Line_Light(points + 2, points + 6, shade); |
45 |
|
46 |
if (is_selected) { |
47 |
M3rGeom_Line_Light(points + 0, points + 3, shade); |
48 |
M3rGeom_Line_Light(points + 1, points + 2, shade); |
49 |
|
50 |
M3rGeom_Line_Light(points + 4, points + 7, shade); |
51 |
M3rGeom_Line_Light(points + 5, points + 6, shade); |
52 |
|
53 |
M3rGeom_Line_Light(points + 2, points + 4, shade); |
54 |
M3rGeom_Line_Light(points + 1, points + 7, shade); |
55 |
M3rGeom_Line_Light(points + 0, points + 6, shade); |
56 |
M3rGeom_Line_Light(points + 3, points + 5, shade); |
57 |
|
58 |
M3rGeom_Line_Light(points + 2, points + 7, shade); |
59 |
M3rGeom_Line_Light(points + 3, points + 6, shade); |
60 |
M3rGeom_Line_Light(points + 0, points + 5, shade); |
61 |
M3rGeom_Line_Light(points + 1, points + 4, shade); |
62 |
} |
63 |
|
64 |
trigger_center = MUgZeroPoint; |
65 |
for(itr = 0; itr < M3cNumBoundingPoints; itr++) |
66 |
{ |
67 |
MUmVector_Add(trigger_center, trigger_center, points[itr]); |
68 |
} |
69 |
|
70 |
MUmVector_Scale(trigger_center, (1.0f / ((float) M3cNumBoundingPoints))); |
71 |
} |
72 |
|
73 |
void DD_OBJiFlag_Draw(OBJtObject *inObject, uint32_t inDrawFlags) |
74 |
{ |
75 |
OBJtOSD_Flag *flag_osd; |
76 |
M3tPoint3D camera_location; |
77 |
|
78 |
M3tPoint3D points[4] = |
79 |
{ |
80 |
{ 0.0f, 0.0f, 0.0f }, |
81 |
{ 0.0f, 10.0f, 0.0f }, |
82 |
{ 0.0f, 8.0f, 4.0f }, |
83 |
{ 0.0f, 6.0f, 0.0f } |
84 |
}; |
85 |
|
86 |
if (OBJgFlag_DrawFlags == UUcFalse) { return; } |
87 |
|
88 |
// get a pointer to the object osd |
89 |
flag_osd = (OBJtOSD_Flag*)inObject->object_data; |
90 |
|
91 |
if ((OBJgFlag_ViewPrefix != 0) && (OBJgFlag_ViewPrefix != flag_osd->id_prefix)) { return; } |
92 |
|
93 |
// set up the matrix stack |
94 |
M3rMatrixStack_Push(); |
95 |
M3rMatrixStack_ApplyTranslate(inObject->position); |
96 |
M3rMatrixStack_Multiply(&flag_osd->rotation_matrix); |
97 |
M3rGeom_State_Commit(); |
98 |
|
99 |
// draw the flag |
100 |
M3rGeom_Line_Light(points + 0, points + 1, flag_osd->shade); |
101 |
M3rGeom_Line_Light(points + 1, points + 2, flag_osd->shade); |
102 |
M3rGeom_Line_Light(points + 2, points + 3, flag_osd->shade); |
103 |
|
104 |
// draw the name |
105 |
camera_location = CArGetLocation(); |
106 |
if (MUrPoint_Distance(&inObject->position, &camera_location) < OBJgFlag_DrawNameDistance) |
107 |
{ |
108 |
OBJiFlag_DrawName(inObject, points + 1); |
109 |
} |
110 |
|
111 |
// draw the rotation ring if this flag is selected |
112 |
if (inDrawFlags & OBJcDrawFlag_Selected) |
113 |
{ |
114 |
M3tBoundingSphere bounding_sphere; |
115 |
|
116 |
OBJrObject_GetBoundingSphere(inObject, &bounding_sphere); |
117 |
OBJrObjectUtil_DrawRotationRings(inObject, &bounding_sphere, OBJcDrawFlag_RingY); |
118 |
} |
119 |
|
120 |
M3rMatrixStack_Pop(); |
121 |
} |
122 |
|