+ mobj->state = st;
+ mobj->tstart = (float)time_msec / 1000.0f;
+}
+
+static void update(struct mobject *mobj, float tsec)
+{
+ int i, count;
+ struct mball *ball;
+ struct mcapsule *caps;
+ float t;
+ cgm_vec3 *idleptr;
+ cgm_vec4 *motptr;
+
+ count = mobj->num_balls + mobj->num_caps;
+
+ if(mobj->state != MOBJ_IDLE) {
+ cgm_midentity(mobj->xform);
+ cgm_mrotate_x(mobj->xform, tsec);
+ cgm_mrotate_y(mobj->xform, tsec);
+ cgm_mtranslate(mobj->xform, mobj->pos.x, mobj->pos.y, mobj->pos.z);
+ }
+ if(mobj->state != MOBJ_HELD) {
+ for(i=0; i<count; i++) {
+ mobj->idlepos[i].x = sin(tsec * mobj->mot[i].x + mobj->mot[i].y) * mobj->mot[i].z * 3.0f;
+ mobj->idlepos[i].z = cos(tsec * mobj->mot[i].z + mobj->mot[i].y) * mobj->mot[i].x * 3.0f;
+ mobj->idlepos[i].y = -BBOX_YSZ * 0.45f;
+ }
+ }
+
+ idleptr = mobj->idlepos;
+ motptr = mobj->mot;
+ ball = mobj->balls;
+ caps = mobj->caps;
+
+ switch(mobj->state) {
+ case MOBJ_IDLE:
+ if(mobj->balls) {
+ for(i=0; i<mobj->num_balls; i++) {
+ ball->pos = idleptr[i];
+ ball->energy = motptr[i].w;
+ ball++;
+ }
+ idleptr += mobj->num_balls;
+ motptr += mobj->num_balls;
+ }
+ if(mobj->caps) {
+ for(i=0; i<mobj->num_caps; i++) {
+ caps->end[0] = caps->end[1] = idleptr[i];
+ caps->energy = motptr[i].w;
+ caps++;
+ }
+ }
+ break;
+
+ case MOBJ_GRABING:
+ t = easeout((tsec - mobj->tstart) / TRANSDUR);
+ if(t >= 1.0f) mobj->swstate(mobj, MOBJ_HELD);
+ if(0) {
+ case MOBJ_DROPPING:
+ t = easein((tsec - mobj->tstart) / TRANSDUR);
+ if(t >= 1.0f) mobj->swstate(mobj, MOBJ_IDLE);
+ }
+ for(i=0; i<mobj->num_balls; i++) {
+ mobj->upd_ball(mobj, ball++, tsec, t);
+ }
+ for(i=0; i<mobj->num_caps; i++) {
+ mobj->upd_caps(mobj, caps++, tsec, t);
+ }
+ break;
+
+ case MOBJ_HELD:
+ for(i=0; i<mobj->num_balls; i++) {
+ mobj->upd_ball(mobj, ball++, tsec, 0);
+ }
+ for(i=0; i<mobj->num_caps; i++) {
+ mobj->upd_caps(mobj, caps++, tsec, 0);
+ }
+ break;