Skip to content

Commit 4a24e81

Browse files
zEGenerator work (#689)
1 parent 2738258 commit 4a24e81

File tree

3 files changed

+172
-55
lines changed

3 files changed

+172
-55
lines changed

src/SB/Core/x/xDraw.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ inline void xDrawLine(const xVec3* a, const xVec3* b)
99
{
1010
}
1111
void xDrawCyl(const xVec3*, F32, F32, U32);
12-
void xDrawSphere2(const xSphere*, U32);
13-
void xDrawSphere2(const xVec3*, F32, U32);
14-
void xDrawOBB(const xBox*, const xMat4x3*);
15-
void xDrawBox(const xBox*);
12+
void xDrawSphere(const xVec3* center, F32 r, U32 flags);
13+
void xDrawSphere2(const xSphere* sph, U32 lod);
14+
void xDrawSphere2(const xVec3* pos, F32 r, U32 lod);
15+
void xDrawOBB(const xBox* b, const xMat4x3* m);
16+
void xDrawBox(const xBox* b);
1617

1718
#endif

src/SB/Game/zEGenerator.cpp

Lines changed: 166 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,52 @@
11
#include "zEGenerator.h"
2+
3+
#include "xDraw.h"
4+
#include "xEntBoulder.h"
5+
#include "xMovePoint.h"
26
#include "zCollGeom.h"
37
#include "zGlobals.h"
4-
5-
#include "xEvent.h"
8+
#include "zThrown.h"
69

710
#include <types.h>
811

9-
extern F32 lbl_803CD290; // 1.0f
10-
extern F32 lbl_803CD294; // 0.0f
11-
extern const char zEGeneratorStringBase[];
12-
1312
void zEGenerator_Init(void* egen, void* asset)
1413
{
1514
zEGenerator_Init((zEGenerator*)egen, (xEntAsset*)asset);
1615
}
1716

18-
// I can't figure out the 2nd parameter for the find asset function call.
19-
// FIXME: struct access offsets and callback definitions with suspect parameter typing
2017
void zEGenerator_Init(zEGenerator* egen, xEntAsset* asset)
2118
{
19+
U32 size;
2220
zEntInit((zEnt*)egen, (xEntAsset*)asset, 'EGEN');
23-
// egen->zasset = asset;
21+
zEGenAsset* zasset = (zEGenAsset*)asset;
22+
egen->zasset = zasset;
2423
if (egen->linkCount != 0)
2524
{
26-
// egen->link = asset + 1;
25+
egen->link = (xLinkAsset*)((U8*)asset + sizeof(zEGenAsset));
2726
}
2827
else
2928
{
3029
egen->link = NULL;
3130
}
32-
// egen->update = zEGenerator_Update;
33-
// egen->move = zEGenerator_Move;
34-
// egen->eventFunc = zEGenerator_EventCB;
35-
// egen->render = zEGenerator_Render;
31+
egen->update = (xEntUpdateCallback)zEGenerator_Update;
32+
egen->move = (xEntMoveCallback)zEGenerator_Move;
33+
egen->eventFunc = (xBaseEventCB)zEGeneratorEventCB;
34+
egen->render = (xEntRenderCallback)zEGenerator_Render;
3635
egen->afile = NULL;
37-
// if (asset->onAnimID)
38-
// {
39-
// void* buf = xSTFindAsset(asset->onAnimID, FREFREFRF);
40-
// if (buf != NULL)
41-
// {
42-
// egen->afile = xAnimFileNew(buf, &zEGeneratorStringBase[0], 0, NULL);
43-
// egen->atbl = xAnimTableNew(&zEGeneratorStringBase[0], NULL, 0);
44-
// xAnimTableNewState(egen->atbl, &zEGeneratorStringBase[1], 0x10, 0, lbl_803CD290, NULL,
45-
// NULL, lbl_803CD294, NULL, NULL, xAnimDefaultBeforeEnter, NULL, NULL);
46-
// xAnimTableAddFile(egen->atbl, egen->afile, &zEGeneratorStringBase[1]);
47-
// xAnimPoolAlloc(globals.scenePreload->mempool, egen, egen->atbl, egen->model);
48-
// }
49-
// }
36+
37+
if (zasset->onAnimID)
38+
{
39+
void* buf = xSTFindAsset(zasset->onAnimID, &size);
40+
if (buf != NULL)
41+
{
42+
egen->afile = xAnimFileNew(buf, "", 0, NULL);
43+
egen->atbl = xAnimTableNew("", NULL, 0);
44+
xAnimTableNewState(egen->atbl, "On", 0x10, 0, 1.0f, NULL, NULL, 0.0f, NULL, NULL,
45+
xAnimDefaultBeforeEnter, NULL, NULL);
46+
xAnimTableAddFile(egen->atbl, egen->afile, "On");
47+
xAnimPoolAlloc(&globals.sceneCur->mempool, egen, egen->atbl, egen->model);
48+
}
49+
}
5050
}
5151

5252
void zEGenerator_Setup(zEGenerator* egen, xScene* sc)
@@ -109,12 +109,53 @@ void zEGenerator_Move(zEGenerator* egen, xScene* sc, F32 dt)
109109
{
110110
}
111111

112+
void zEGenerator_Update(zEGenerator* egen, xScene* sc, F32 dt)
113+
{
114+
xEntUpdate(egen, sc, dt);
115+
xMat4x3Toworld(&egen->src_pos, (xMat4x3*)egen->model->Mat, &egen->zasset->src_dpos);
116+
117+
zEnt* ent = (zEnt*)egen->dst;
118+
119+
if (ent != NULL && ent->baseFlags & 0x20)
120+
{
121+
if (ent->baseType == eBaseTypeBoulder)
122+
{
123+
xVec3Copy(&egen->dst_pos, xEntGetCenter(ent));
124+
}
125+
else
126+
{
127+
xMat4x3Toworld(&egen->dst_pos, (xMat4x3*)ent->model->Mat, &egen->dst_off);
128+
}
129+
}
130+
131+
if (egen->lfx[0] != NULL)
132+
{
133+
zLightningModifyEndpoints(egen->lfx[0], &egen->src_pos, &egen->dst_pos);
134+
}
135+
136+
if (egen->lfx[1] != NULL)
137+
{
138+
zLightningModifyEndpoints(egen->lfx[1], &egen->src_pos, &egen->dst_pos);
139+
}
140+
141+
if (egen->tmr > 0.0f)
142+
{
143+
egen->tmr -= dt;
144+
145+
if (egen->tmr <= 0.0f)
146+
{
147+
zEGenerator_TurnOff(egen);
148+
zEntEvent((xBase*)egen, eEventOff);
149+
}
150+
}
151+
}
152+
112153
void zEGenerator_Render(zEGenerator* egen)
113154
{
114155
xEntRender((xEnt*)egen);
115156
}
116157

117-
// WIP.
158+
// scheduling
118159
void zEGenerator_TurnOn(zEGenerator* egen)
119160
{
120161
egen->flags |= 1;
@@ -124,16 +165,57 @@ void zEGenerator_TurnOn(zEGenerator* egen)
124165
egen->model->Anim->Single->CurrentSpeed = 1.0f;
125166
}
126167
egen->tmr = zasset->ontime;
127-
xMat4x3Toworld(&egen->src_pos, (const xMat4x3*)&egen->model->Mat, &egen->zasset->src_dpos);
168+
xMat4x3Toworld(&egen->src_pos, (xMat4x3*)egen->model->Mat, &zasset->src_dpos);
169+
128170
if (egen->num_dsts)
129171
{
130-
// TODO!!!
131-
}
132-
else
133-
{
134-
// FIXME: Find correct definition
135-
// xDrawSphere(&egen->dst_pos, @856, 0xc006);
172+
U16 itgt = xrand() % egen->num_dsts;
173+
U16 imp = 0;
174+
175+
for (S32 i = 0; i < egen->linkCount; i++)
176+
{
177+
const xLinkAsset* link = &egen->link[i];
178+
xBase* b = zSceneFindObject(link->dstAssetID);
179+
180+
xVec3 destOffset;
181+
destOffset.x = link->param[0];
182+
destOffset.y = link->param[1];
183+
destOffset.z = link->param[2];
184+
xVec3Copy(&egen->dst_off, &destOffset);
185+
186+
if (!b || link->dstEvent != eEventArcto)
187+
continue;
188+
189+
if (imp == itgt)
190+
{
191+
if (b->baseType == eBaseTypeMovePoint)
192+
{
193+
xVec3Copy(&egen->dst_pos, xMovePointGetPos((xMovePoint*)b));
194+
xVec3AddTo(&egen->dst_pos, &egen->dst_off);
195+
egen->dst = b;
196+
break;
197+
}
198+
if (b->baseType == eBaseTypeBoulder)
199+
{
200+
xVec3Copy(&egen->dst_pos, xEntGetCenter((xEntBoulder*)b));
201+
egen->dst = b;
202+
break;
203+
}
204+
if ((b->baseFlags & 0x20) != 0)
205+
{
206+
xMat4x3Toworld(&egen->dst_pos, (xMat4x3*)((xEnt*)b)->model->Mat, &egen->dst_off);
207+
egen->dst = b;
208+
break;
209+
}
210+
}
211+
else
212+
{
213+
imp++;
214+
}
215+
}
136216
}
217+
xDrawSphere(&egen->dst_pos, 2.0f, 0xC0006);
218+
137219
for (S32 i = 0; i < 2; i++)
138220
{
139221
if (egen->lfx[i] != NULL)
@@ -142,15 +224,47 @@ void zEGenerator_TurnOn(zEGenerator* egen)
142224
egen->lfx[i] = NULL;
143225
}
144226
}
145-
// TODO!!!
227+
228+
_tagLightningAdd add;
229+
memset(&add, 0, sizeof(_tagLightningAdd));
230+
add.type = 3;
231+
add.total_points = ((xrand() << 1) & 6) + 8;
232+
add.start = &egen->src_pos;
233+
add.end = &egen->dst_pos;
234+
add.color = xColorFromRGBA(200, 200, 255, 200);
235+
add.thickness = 0.3f;
236+
add.arc_height = -0.2f;
237+
add.zeus_normal_offset = 0.2f;
238+
add.zeus_back_offset = 0.1f;
239+
add.zeus_side_offset = 0.1f;
240+
add.rand_radius = 15.0f;
241+
add.flags = 0x1C30;
242+
egen->lfx[0] = zLightningAdd(&add);
243+
244+
add.total_points = 0x10;
245+
add.type = 3;
246+
add.move_degrees = 360.0f * xurand() + 180.0f;
247+
248+
if (xrand() & 1)
249+
{
250+
add.move_degrees = -add.move_degrees;
251+
}
252+
253+
add.setup_degrees = 90.0f * xurand() + 20.0f;
254+
add.color = xColorFromRGBA(80, 100, 255, 200);
255+
add.rot_radius = 0.25f;
256+
add.thickness = 0.3f;
257+
add.rand_radius = 10.0f;
258+
add.flags = 0xC18;
259+
egen->lfx[1] = zLightningAdd(&add);
146260
}
147261

148262
void zEGenerator_TurnOff(zEGenerator* egen)
149263
{
150264
egen->flags &= 0xfffe;
151265
if (egen->afile != NULL)
152266
{
153-
egen->model->Anim->Single->CurrentSpeed = lbl_803CD294;
267+
egen->model->Anim->Single->CurrentSpeed = 0.0f;
154268
}
155269
for (S32 i = 0; i < 2; i++)
156270
{
@@ -174,7 +288,6 @@ void zEGenerator_ToggleOn(zEGenerator* egen)
174288
}
175289
}
176290

177-
// Need to figure out how to call the link function. Everything else should be in order as long as the case labels are correct.
178291
S32 zEGeneratorEventCB(xBase* to, xBase* from, U32 toEvent, const F32* toParam,
179292
xBase* toParamWidget)
180293
{
@@ -191,37 +304,39 @@ S32 zEGeneratorEventCB(xBase* to, xBase* from, U32 toEvent, const F32* toParam,
191304
zEGenerator_ToggleOn(egen);
192305
break;
193306
case eEventReset:
194-
zEGenerator_Reset(egen, (xScene*)globals.scenePreload);
307+
zEGenerator_Reset(egen, (xScene*)globals.sceneCur);
195308
break;
309+
case eEventVisible:
196310
case eEventFastVisible:
197-
xEntShow((xEnt*)egen);
311+
xEntShow(egen);
198312
break;
313+
case eEventInvisible:
199314
case eEventFastInvisible:
200-
xEntHide((xEnt*)egen);
315+
xEntHide(egen);
201316
break;
202317
case eEventCollision_Visible_On:
203-
xEntShow((xEnt*)egen);
318+
xEntShow(egen);
319+
case eEventCollisionOn:
204320
egen->chkby = XENT_COLLTYPE_PLYR | XENT_COLLTYPE_NPC;
205-
egen->bupdate((xEnt*)egen, (xVec3*)&egen->model->Mat->pos);
321+
egen->bupdate(egen, (xVec3*)&egen->model->Mat->pos);
206322
break;
207323
case eEventCollision_Visible_Off:
208-
xEntHide((xEnt*)egen);
324+
xEntHide(egen);
325+
case eEventCollisionOff:
209326
egen->chkby = XENT_COLLTYPE_NONE;
210327
break;
211328
case eEventCameraCollideOn:
212-
zCollGeom_CamEnable((xEnt*)egen);
329+
zCollGeom_CamEnable(egen);
213330
break;
214331
case eEventCameraCollideOff:
215-
zCollGeom_CamDisable((xEnt*)egen);
332+
zCollGeom_CamDisable(egen);
216333
break;
217334
case eEventLaunchShrapnel:
218-
if (toParamWidget == NULL)
219-
break;
220-
if (toParamWidget->link == NULL)
335+
zShrapnelAsset* shrap = (zShrapnelAsset*)toParamWidget;
336+
if (shrap == NULL || shrap->initCB == NULL)
221337
break;
222338

223-
// FIXME: xLinkAsset isn't a function call :(
224-
// toParamWidget->link(toParamWidget, egen->model, 0, 0);
339+
shrap->initCB(shrap, egen->model, 0, 0);
225340
break;
226341
}
227342
return eEventEnable;

src/SB/Game/zEGenerator.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ void zEGenerator_Save(zEGenerator* ent, xSerial* s);
3636
void zEGenerator_Load(zEGenerator* ent, xSerial* s);
3737
void zEGenerator_Reset(zEGenerator* egen, xScene* sc);
3838
void zEGenerator_Move(zEGenerator* egen, xScene* sc, F32 dt);
39+
void zEGenerator_Update(zEGenerator* egen, xScene* sc, F32 dt);
3940
void zEGenerator_Render(zEGenerator* egen);
4041
void zEGenerator_TurnOn(zEGenerator* egen);
4142
void zEGenerator_TurnOff(zEGenerator* egen);

0 commit comments

Comments
 (0)