From 9bc57a0641cdb807547590df74854e1bee1383d9 Mon Sep 17 00:00:00 2001 From: aap Date: Thu, 18 Feb 2016 14:56:10 +0100 Subject: [PATCH] atomic world bounding sphere --- TODO | 5 ----- src/clump.cpp | 22 +++++++++++++++++++--- src/rwobjects.h | 19 ++++++++++++++----- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/TODO b/TODO index a216054..225a256 100644 --- a/TODO +++ b/TODO @@ -2,14 +2,9 @@ BUGS: - fseek with negative offset on ps2 over ps2link messes up the current position Clump & related: - - make pointer arrays into lists - !!! work on ref counts, destruction, copying etc. - define and use types: - sphere - matrix color - realcolor - vector3 triangle texcoord - implement plugins: diff --git a/src/clump.cpp b/src/clump.cpp index 4d07c82..05f5b2c 100644 --- a/src/clump.cpp +++ b/src/clump.cpp @@ -568,14 +568,14 @@ Atomic::create(void) assert(atomic != NULL); atomic->object.init(Atomic::ID, 0); atomic->geometry = NULL; + atomic->worldBoundingSphere.center.set(0.0f, 0.0f, 0.0f); + atomic->worldBoundingSphere.radius = 0.0f; + atomic->setFrame(NULL); atomic->clump = NULL; atomic->pipeline = NULL; atomic->renderCB = Atomic::defaultRenderCB; atomic->object.flags = Atomic::COLLISIONTEST | Atomic::RENDER; atomic->constructPlugins(); - - // private flags: - // rpATOMICPRIVATEWORLDBOUNDDIRTY = 0x01 return atomic; } @@ -606,6 +606,22 @@ Atomic::destroy(void) free(this); } +Sphere* +Atomic::getWorldBoundingSphere(void) +{ + Sphere *s = &this->worldBoundingSphere; + if(!this->getFrame()->dirty() && + (this->object.privateFlags & WORLDBOUNDDIRTY) == 0) + return s; + Matrix *ltm = this->getFrame()->getLTM(); + // TODO: support scaling + s->center = ltm->transPoint(s->center); + // TODO: if we ever support morphing, fix this: + s->radius = this->geometry->morphTargets[0].boundingSphere.radius; + this->object.privateFlags &= ~WORLDBOUNDDIRTY; + return s; +} + static uint32 atomicRights[2]; Atomic* diff --git a/src/rwobjects.h b/src/rwobjects.h index 59296e8..362e25f 100644 --- a/src/rwobjects.h +++ b/src/rwobjects.h @@ -119,6 +119,8 @@ struct Frame : PluginBase Frame *getParent(void){ return (Frame*)this->object.parent; } int32 count(void); + bool32 dirty(void) { + return !!(this->root->object.privateFlags & HIERARCHYSYNC); } Matrix *getLTM(void); void updateObjects(void); @@ -558,11 +560,14 @@ struct Atomic : PluginBase enum { ID = 1 }; enum { COLLISIONTEST = 0x01, // unused here - RENDER = 0x04 + RENDER = 0x04, + // private + WORLDBOUNDDIRTY = 0x01 }; ObjectWithFrame object; Geometry *geometry; + Sphere worldBoundingSphere; Clump *clump; LLLink inClump; ObjPipeline *pipeline; @@ -571,17 +576,21 @@ struct Atomic : PluginBase static Atomic *create(void); Atomic *clone(void); void destroy(void); - void setFrame(Frame *f) { this->object.setFrame(f); } + void setFrame(Frame *f) { + this->object.setFrame(f); + this->object.privateFlags |= WORLDBOUNDDIRTY; + } Frame *getFrame(void) { return (Frame*)this->object.parent; } static Atomic *fromClump(LLLink *lnk){ return LLLinkGetData(lnk, Atomic, inClump); } + ObjPipeline *getPipeline(void); + Sphere *getWorldBoundingSphere(void); static Atomic *streamReadClump(Stream *stream, - Frame **frameList, Geometry **geometryList); + Frame **frameList, Geometry **geometryList); + void render(void) { this->renderCB(this); } bool streamWriteClump(Stream *stream, Frame **frameList, int32 numframes); uint32 streamGetSize(void); - ObjPipeline *getPipeline(void); - void render(void) { this->renderCB(this); } static void defaultRenderCB(Atomic *atomic); };