Browse Source

Added getResourceRefs() function to Component.

Lasse Öörni 15 years ago
parent
commit
d1bf5d5702

+ 7 - 0
Engine/Audio/PositionalChannel.cpp

@@ -238,6 +238,13 @@ void PositionalChannel::readNetUpdate(Deserializer& source, ResourceCache* cache
     }
 }
 
+void PositionalChannel::getResourceRefs(std::vector<Resource*>& dest)
+{
+    Sound* sound = getSound();
+    if (sound)
+        dest.push_back(sound);
+}
+
 void PositionalChannel::update(float timeStep)
 {
     if (!mAudio)

+ 2 - 0
Engine/Audio/PositionalChannel.h

@@ -53,6 +53,8 @@ public:
     virtual bool writeNetUpdate(Serializer& dest, Serializer& destRevision, Deserializer& baseRevision, const NetUpdateInfo& info);
     //! Read a network update
     virtual void readNetUpdate(Deserializer& source, ResourceCache* cache, const NetUpdateInfo& info);
+    //! Return resource references
+    virtual void getResourceRefs(std::vector<Resource*>& dest);
     //! Update channel
     virtual void update(float timeStep);
     

+ 7 - 0
Engine/Audio/StereoChannel.cpp

@@ -194,6 +194,13 @@ void StereoChannel::readNetUpdate(Deserializer& source, ResourceCache* cache, co
     }
 }
 
+void StereoChannel::getResourceRefs(std::vector<Resource*>& dest)
+{
+    Sound* sound = getSound();
+    if (sound)
+        dest.push_back(sound);
+}
+
 void StereoChannel::update(float timeStep)
 {
     if (!mAudio)

+ 2 - 0
Engine/Audio/StereoChannel.h

@@ -48,6 +48,8 @@ public:
     virtual bool writeNetUpdate(Serializer& dest, Serializer& destRevision, Deserializer& baseRevision, const NetUpdateInfo& info);
     //! Read a network update
     virtual void readNetUpdate(Deserializer& source, ResourceCache* cache, const NetUpdateInfo& info);
+    //! Return resource references
+    virtual void getResourceRefs(std::vector<Resource*>& dest);
     //! Update channel
     virtual void update(float timeStep);
     

+ 7 - 0
Engine/Engine/ParticleEmitter.cpp

@@ -226,6 +226,13 @@ void ParticleEmitter::readNetUpdate(Deserializer& source, ResourceCache* cache,
     readBoolDelta(mUpdateInvisible, source, bits & 4);
 }
 
+void ParticleEmitter::getResourceRefs(std::vector<Resource*>& dest)
+{
+    BillboardSet::getResourceRefs(dest);
+    if (mParameterSource)
+        dest.push_back(mParameterSource);
+}
+
 void ParticleEmitter::update(float timeStep)
 {
     // If this is a playback update, return so that we do not erroneously accelerate emitter animation

+ 2 - 0
Engine/Engine/ParticleEmitter.h

@@ -79,6 +79,8 @@ public:
     virtual bool writeNetUpdate(Serializer& dest, Serializer& destRevision, Deserializer& baseRevision, const NetUpdateInfo& info);
     //! Read a network update
     virtual void readNetUpdate(Deserializer& source, ResourceCache* cache, const NetUpdateInfo& info);
+    //! Return resource references
+    virtual void getResourceRefs(std::vector<Resource*>& dest);
     
     //! Update the particle system. Is called from handleScenePostUpdate()
     void update(float timeStep);

+ 6 - 0
Engine/Physics/RigidBody.cpp

@@ -399,6 +399,12 @@ void RigidBody::interpolate(bool snapToEnd)
     Node::interpolate(snapToEnd);
 }
 
+void RigidBody::getResourceRefs(std::vector<Resource*>& dest)
+{
+    if (mCollisionShape)
+        dest.push_back(mCollisionShape);
+}
+
 void RigidBody::setMode(PhysicsMode mode)
 {
     mMode = mode;

+ 2 - 0
Engine/Physics/RigidBody.h

@@ -68,6 +68,8 @@ public:
     virtual void readNetUpdate(Deserializer& source, ResourceCache* cache, const NetUpdateInfo& info);
     //! Perform client-side visual smoothing
     virtual void interpolate(bool snapToEnd);
+    //! Return resource references
+    virtual void getResourceRefs(std::vector<Resource*>& dest);
     
     //! Set motion mode
     void setMode(PhysicsMode mode);

+ 7 - 0
Engine/Renderer/AnimatedModel.cpp

@@ -448,6 +448,13 @@ void AnimatedModel::interpolate(bool snapToEnd)
         (*i)->interpolate(snapToEnd, t);
 }
 
+void AnimatedModel::getResourceRefs(std::vector<Resource*>& dest)
+{
+    StaticModel::getResourceRefs(dest);
+    for (unsigned i = 0; i < mAnimationStates.size(); ++i)
+        dest.push_back(mAnimationStates[i]->getAnimation());
+}
+
 void AnimatedModel::processRayQuery(RayOctreeQuery& query, float initialDistance)
 {
     // If no bones or no bone-level testing, use the GeometryNode test

+ 2 - 0
Engine/Renderer/AnimatedModel.h

@@ -60,6 +60,8 @@ public:
     virtual void readNetUpdate(Deserializer& source, ResourceCache* cache, const NetUpdateInfo& info);
     //! Perform client-side visual smoothing
     virtual void interpolate(bool snapToEnd);
+    //! Return resource references
+    virtual void getResourceRefs(std::vector<Resource*>& dest);
     
     //! Process renderer raycast
     virtual void processRayQuery(RayOctreeQuery& query, float initialDistance);

+ 6 - 0
Engine/Renderer/BillboardSet.cpp

@@ -237,6 +237,12 @@ void BillboardSet::readNetUpdate(Deserializer& source, ResourceCache* cache, con
         markPositionsDirty();
 }
 
+void BillboardSet::getResourceRefs(std::vector<Resource*>& dest)
+{
+    if (mMaterial)
+        dest.push_back(mMaterial);
+}
+
 void BillboardSet::updateDistance(const FrameInfo& frame)
 {
     // Check if position relative to camera has changed, and re-sort in that case

+ 2 - 0
Engine/Renderer/BillboardSet.h

@@ -69,6 +69,8 @@ public:
     virtual bool writeNetUpdate(Serializer& dest, Serializer& destRevision, Deserializer& baseRevision, const NetUpdateInfo& info);
     //! Read a network update
     virtual void readNetUpdate(Deserializer& source, ResourceCache* cache, const NetUpdateInfo& info);
+    //! Return resource references
+    virtual void getResourceRefs(std::vector<Resource*>& dest);
     
     //! Calculate distance for rendering
     virtual void updateDistance(const FrameInfo& frame);

+ 9 - 0
Engine/Renderer/CustomObject.cpp

@@ -202,6 +202,15 @@ void CustomObject::loadXML(const XMLElement& source, ResourceCache* cache)
     }
 }
 
+void CustomObject::getResourceRefs(std::vector<Resource*>& dest)
+{
+    for (unsigned i = 0; i < mCustomGeometries.size(); ++i)
+    {
+        if (mCustomGeometries[i].mMaterial)
+            dest.push_back(mCustomGeometries[i].mMaterial);
+    }
+}
+
 void CustomObject::processRayQuery(RayOctreeQuery& query, float initialDistance)
 {
     PROFILE(CustomObject_Raycast);

+ 2 - 0
Engine/Renderer/CustomObject.h

@@ -83,6 +83,8 @@ public:
     virtual void saveXML(XMLElement& dest);
     //! Read component state from an XML element
     virtual void loadXML(const XMLElement& source, ResourceCache* cache);
+    //! Return resource references
+    virtual void getResourceRefs(std::vector<Resource*>& dest);
     
     //! Process renderer raycast
     virtual void processRayQuery(RayOctreeQuery& query, float initialDistance);

+ 11 - 0
Engine/Renderer/InstancedModel.cpp

@@ -294,6 +294,17 @@ void InstancedModel::readNetUpdate(Deserializer& source, ResourceCache* cache, c
     }
 }
 
+void InstancedModel::getResourceRefs(std::vector<Resource*>& dest)
+{
+    if (mModel)
+        dest.push_back(mModel);
+    for (unsigned i = 0; i < mOriginalMaterials.size(); ++i)
+    {
+        if (mOriginalMaterials[i])
+            dest.push_back(mOriginalMaterials[i]);
+    }
+}
+
 void InstancedModel::processRayQuery(RayOctreeQuery& query, float initialDistance)
 {
     PROFILE(InstancedModel_Raycast);

+ 2 - 0
Engine/Renderer/InstancedModel.h

@@ -67,6 +67,8 @@ public:
     virtual bool writeNetUpdate(Serializer& dest, Serializer& destRevision, Deserializer& baseRevision, const NetUpdateInfo& info);
     //! Read a network update
     virtual void readNetUpdate(Deserializer& source, ResourceCache* cache, const NetUpdateInfo& info);
+    //! Return resource references
+    virtual void getResourceRefs(std::vector<Resource*>& dest);
     
     //! Process renderer raycast
     virtual void processRayQuery(RayOctreeQuery& query, float initialDistance);

+ 8 - 0
Engine/Renderer/Light.cpp

@@ -438,6 +438,14 @@ void Light::readNetUpdate(Deserializer& source, ResourceCache* cache, const NetU
         markDirty();
 }
 
+void Light::getResourceRefs(std::vector<Resource*>& dest)
+{
+    if (mRampTexture)
+        dest.push_back(mRampTexture);
+    if (mSpotTexture)
+        dest.push_back(mSpotTexture);
+}
+
 void Light::updateDistance(const FrameInfo& frame)
 {
     switch (mLightType)

+ 2 - 0
Engine/Renderer/Light.h

@@ -156,6 +156,8 @@ public:
     virtual bool writeNetUpdate(Serializer& dest, Serializer& destRevision, Deserializer& baseRevision, const NetUpdateInfo& info);
     //! Read a network update
     virtual void readNetUpdate(Deserializer& source, ResourceCache* cache, const NetUpdateInfo& info);
+    //! Return resource references
+    virtual void getResourceRefs(std::vector<Resource*>& dest);
     
     //! Calculate distance for rendering
     virtual void updateDistance(const FrameInfo& frame);

+ 11 - 0
Engine/Renderer/StaticModel.cpp

@@ -157,6 +157,17 @@ void StaticModel::readNetUpdate(Deserializer& source, ResourceCache* cache, cons
     }
 }
 
+void StaticModel::getResourceRefs(std::vector<Resource*>& dest)
+{
+    if (mModel)
+        dest.push_back(mModel);
+    for (unsigned i = 0; i < mMaterials.size(); ++i)
+    {
+        if (mMaterials[i])
+            dest.push_back(mMaterials[i]);
+    }
+}
+
 void StaticModel::processRayQuery(RayOctreeQuery& query, float initialDistance)
 {
     PROFILE(StaticModel_Raycast);

+ 2 - 0
Engine/Renderer/StaticModel.h

@@ -51,6 +51,8 @@ public:
     virtual bool writeNetUpdate(Serializer& dest, Serializer& destRevision, Deserializer& baseRevision, const NetUpdateInfo& info);
     //! Read a network update
     virtual void readNetUpdate(Deserializer& source, ResourceCache* cache, const NetUpdateInfo& info);
+    //! Return resource references
+    virtual void getResourceRefs(std::vector<Resource*>& dest);
     
     //! Process renderer raycast
     virtual void processRayQuery(RayOctreeQuery& query, float initialDistance);

+ 4 - 0
Engine/Scene/Component.cpp

@@ -99,6 +99,10 @@ void Component::getComponentRefs(std::vector<ComponentRef>& dest)
 {
 }
 
+void Component::getResourceRefs(std::vector<Resource*>& dest)
+{
+}
+
 void Component::setName(const std::string& name)
 {
     mName = name;

+ 3 - 0
Engine/Scene/Component.h

@@ -31,6 +31,7 @@ typedef unsigned EntityID;
 class Connection;
 class Deserializer;
 class Entity;
+class Resource;
 class ResourceCache;
 class Serializer;
 class XMLElement;
@@ -96,6 +97,8 @@ public:
     virtual void interpolate(bool snapToEnd = false);
     //! Return component references
     virtual void getComponentRefs(std::vector<ComponentRef>& dest);
+    //! Return resource references
+    virtual void getResourceRefs(std::vector<Resource*>& dest);
     
     //! Set name
     void setName(const std::string& name);

+ 7 - 0
Engine/Scene/Entity.cpp

@@ -268,6 +268,13 @@ void Entity::getComponentRefs(std::vector<ComponentRef>& dest)
         (*i)->getComponentRefs(dest);
 }
 
+void Entity::getResourceRefs(std::vector<Resource*>& dest)
+{
+    dest.clear();
+    for (std::vector<SharedPtr<Component> >::iterator i = mComponents.begin(); i != mComponents.end(); ++i)
+        (*i)->getResourceRefs(dest);
+}
+
 void Entity::setName(const std::string& name)
 {
     mName = name;

+ 2 - 1
Engine/Scene/Entity.h

@@ -86,7 +86,8 @@ public:
     void interpolate(bool snapToEnd = false);
     //! Let each component list component references
     void getComponentRefs(std::vector<ComponentRef>& dest);
-    
+    //! Let each component list resource references
+    void getResourceRefs(std::vector<Resource*>& dest);
     //! Set name
     void setName(const std::string& name);
     //! Set network replication flags

+ 24 - 7
Engine/Script/ScriptInstance.cpp

@@ -55,7 +55,8 @@ static const std::string methodDeclarations[] = {
     "void readNetUpdate(Deserializer&, const NetUpdateInfo&)",
     "void postNetUpdate()",
     "void interpolate(bool)",
-    "array<ComponentRef> getComponentRefs()"
+    "array<ComponentRef> getComponentRefs()",
+    "array<Resource@> getResourceRefs()"
 };
 
 std::map<void*, ScriptInstance*> objectToInstance;
@@ -254,6 +255,23 @@ void ScriptInstance::getComponentRefs(std::vector<ComponentRef>& dest)
     }
 }
 
+void ScriptInstance::getResourceRefs(std::vector<Resource*>& dest)
+{
+    if (mMethods[METHOD_GETRESOURCEREFS])
+    {
+        asIScriptContext* context = mScriptEngine->getScriptFileContext(getScriptNestingLevel());
+        if (!context)
+            return;
+        mScriptFile->execute(mScriptObject, mMethods[METHOD_GETRESOURCEREFS]);
+        CScriptArray* arr = static_cast<CScriptArray*>(context->GetAddressOfReturnValue());
+        if (arr)
+        {
+            for (unsigned i = 0; i < arr->GetSize(); ++i)
+                dest.push_back(*(static_cast<Resource**>(arr->At(i))));
+        }
+    }
+}
+
 bool ScriptInstance::setScriptClass(ScriptFile* scriptFile, const std::string& className)
 {
     if ((scriptFile == mScriptFile) && (className == mClassName))
@@ -277,7 +295,7 @@ void ScriptInstance::setEnabled(bool enable)
 
 bool ScriptInstance::execute(const std::string& declaration, const std::vector<Variant>& parameters)
 {
-    if ((!mScriptFile) || (!mScriptObject))
+    if (!mScriptObject)
         return false;
     
     asIScriptFunction* method = mScriptFile->getMethod(mScriptObject, declaration);
@@ -286,7 +304,7 @@ bool ScriptInstance::execute(const std::string& declaration, const std::vector<V
 
 bool ScriptInstance::execute(asIScriptFunction* method, const std::vector<Variant>& parameters)
 {
-    if ((!method) || (!mScriptFile) || (!mScriptObject))
+    if ((!method) || (!mScriptObject))
         return false;
     
     return mScriptFile->execute(mScriptObject, method, parameters);
@@ -294,7 +312,7 @@ bool ScriptInstance::execute(asIScriptFunction* method, const std::vector<Varian
 
 void ScriptInstance::addEventHandler(StringHash eventType, const std::string& handlerName)
 {
-    if ((!mScriptFile) || (!mScriptObject))
+    if (!mScriptObject)
         return;
     
     std::string declaration = "void " + handlerName + "(StringHash, VariantMap&)";
@@ -343,7 +361,7 @@ void ScriptInstance::releaseObject()
 {
     if (mScriptObject)
     {
-        if ((mScriptFile) && (mMethods[METHOD_STOP]))
+        if (mMethods[METHOD_STOP])
             mScriptFile->execute(mScriptObject, mMethods[METHOD_STOP]);
         
         removeAllEventHandlers();
@@ -355,8 +373,7 @@ void ScriptInstance::releaseObject()
         
         objectToInstance.erase((void*)mScriptObject);
         
-        if (mScriptFile)
-            mScriptFile->removeScriptInstance(this);
+        mScriptFile->removeScriptInstance(this);
     }
 }
 

+ 3 - 0
Engine/Script/ScriptInstance.h

@@ -57,6 +57,7 @@ enum ScriptInstanceMethod
     METHOD_POSTNETUPDATE,
     METHOD_INTERPOLATE,
     METHOD_GETCOMPONENTREFS,
+    METHOD_GETRESOURCEREFS,
     MAX_SCRIPT_METHODS
 };
 
@@ -91,6 +92,8 @@ public:
     virtual void interpolate(bool snapToEnd);
     //! Return component references
     virtual void getComponentRefs(std::vector<ComponentRef>& dest);
+    //! Return resource references
+    virtual void getResourceRefs(std::vector<Resource*>& dest);
     //! Add an event handler. Called by script exposed version of subscribeToEvent()
     virtual void addEventHandler(StringHash eventType, const std::string& handlerName);