Browse Source

Add Technique::Clone(). Improve Technique / Pass Lua bindings. Closes #1203.

Lasse Öörni 9 years ago
parent
commit
09e1330f5f

+ 10 - 0
Source/Urho3D/AngelScript/GraphicsAPI.cpp

@@ -536,6 +536,15 @@ static void RegisterTextures(asIScriptEngine* engine)
     engine->RegisterGlobalFunction("uint GetMaxBones()", asFUNCTION(Graphics::GetMaxBones), asCALL_CDECL);
 }
 
+static Technique* TechniqueClone(const String& cloneName, Technique* ptr)
+{
+    SharedPtr<Technique> clone = ptr->Clone(cloneName);
+    // The shared pointer will go out of scope, so have to increment the reference count
+    // (here an auto handle can not be used)
+    clone->AddRef();
+    return clone.Get();
+}
+
 static Material* MaterialClone(const String& cloneName, Material* ptr)
 {
     SharedPtr<Material> clone = ptr->Clone(cloneName);
@@ -813,6 +822,7 @@ static void RegisterMaterial(asIScriptEngine* engine)
     RegisterResource<Technique>(engine, "Technique");
     engine->RegisterObjectMethod("Technique", "Pass@+ CreatePass(const String&in)", asMETHOD(Technique, CreatePass), asCALL_THISCALL);
     engine->RegisterObjectMethod("Technique", "void RemovePass(const String&in)", asMETHOD(Technique, RemovePass), asCALL_THISCALL);
+    engine->RegisterObjectMethod("Technique", "Technique@ Clone(const String&in cloneName = String()) const", asFUNCTION(TechniqueClone), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Technique", "bool HasPass(const String&in) const", asMETHODPR(Technique, HasPass, (const String&) const, bool), asCALL_THISCALL);
     engine->RegisterObjectMethod("Technique", "Pass@+ GetPass(const String&in)", asMETHODPR(Technique, GetPass, (const String&) const, Pass*), asCALL_THISCALL);
     engine->RegisterObjectMethod("Technique", "Pass@+ GetSupportedPass(const String&in)", asMETHODPR(Technique, GetSupportedPass, (const String&) const, Pass*), asCALL_THISCALL);

+ 29 - 0
Source/Urho3D/Graphics/Technique.cpp

@@ -303,6 +303,35 @@ void Technique::ReleaseShaders()
     }
 }
 
+SharedPtr<Technique> Technique::Clone(const String& cloneName) const
+{
+    SharedPtr<Technique> ret(new Technique(context_));
+    ret->SetIsDesktop(isDesktop_);
+    ret->SetName(cloneName);
+
+    // Deep copy passes
+    for (Vector<SharedPtr<Pass> >::ConstIterator i = passes_.Begin(); i != passes_.End(); ++i)
+    {
+        Pass* srcPass = i->Get();
+        if (!srcPass)
+            continue;
+
+        Pass* newPass = ret->CreatePass(srcPass->GetName());
+        newPass->SetBlendMode(srcPass->GetBlendMode());
+        newPass->SetDepthTestMode(srcPass->GetDepthTestMode());
+        newPass->SetLightingMode(srcPass->GetLightingMode());
+        newPass->SetDepthWrite(srcPass->GetDepthWrite());
+        newPass->SetAlphaMask(srcPass->GetAlphaMask());
+        newPass->SetIsDesktop(srcPass->IsDesktop());
+        newPass->SetVertexShader(srcPass->GetVertexShader());
+        newPass->SetPixelShader(srcPass->GetPixelShader());
+        newPass->SetVertexShaderDefines(srcPass->GetVertexShaderDefines());
+        newPass->SetPixelShaderDefines(srcPass->GetPixelShaderDefines());
+    }
+
+    return ret;
+}
+
 Pass* Technique::CreatePass(const String& name)
 {
     Pass* oldPass = GetPass(name);

+ 2 - 0
Source/Urho3D/Graphics/Technique.h

@@ -176,6 +176,8 @@ public:
     void RemovePass(const String& passName);
     /// Reset shader pointers in all passes.
     void ReleaseShaders();
+    /// Clone the technique. Passes will be deep copied to allow independent modification.
+    SharedPtr<Technique> Clone(const String& cloneName = String::EMPTY) const;
 
     /// Return whether requires desktop level hardware.
     bool IsDesktop() const { return isDesktop_; }

+ 50 - 2
Source/Urho3D/LuaScript/pkgs/Graphics/Technique.pkg

@@ -9,17 +9,53 @@ enum PassLightingMode
 
 class Pass : public RefCounted
 {
+    void SetBlendMode(BlendMode mode);
+    void SetDepthTestMode(CompareMode mode);
+    void SetLightingMode(PassLightingMode mode);
+    void SetDepthWrite(bool enable);
+    void SetAlphaMask(bool enable);
+    void SetIsDesktop(bool enable);
+    void SetVertexShader(const String name);
+    void SetPixelShader(const String name);
+    void SetVertexShaderDefines(const String defines);
+    void SetPixelShaderDefines(const String defines);
+    void ReleaseShaders();
+
+    const String GetName() const;
+    unsigned GetIndex() const;
+    BlendMode GetBlendMode() const;
+    CompareMode GetDepthTestMode() const;
+    PassLightingMode GetLightingMode() const;
+    bool GetDepthWrite() const;
+    bool GetAlphaMask() const;
     bool IsDesktop() const;
     const String GetVertexShader() const;
     const String GetPixelShader() const;
+    const String GetVertexShaderDefines() const;
+    const String GetPixelShaderDefines() const;
 
+    tolua_readonly tolua_property__get_set String name;
+    tolua_readonly tolua_property__get_set unsigned index;
+    tolua_property__get_set BlendMode blendMode;
+    tolua_property__get_set CompareMode depthTestMode;
+    tolua_property__get_set PassLightingMode lightingMode;
+    tolua_property__get_set bool depthWrite;
+    tolua_property__get_set bool alphaMask;
     tolua_readonly tolua_property__is_set bool desktop;
-    tolua_readonly tolua_property__get_set const String vertexShader;
-    tolua_readonly tolua_property__get_set const String pixelShader;
+    tolua_property__get_set String vertexShader;
+    tolua_property__get_set String pixelShader;
+    tolua_property__get_set String vertexShaderDefines;
+    tolua_property__get_set String pixelShaderDefines;
 };
 
 class Technique : public Resource
 {
+    void SetIsDesktop(bool enable);
+    Pass* CreatePass(const String passName);
+    void RemovePass(const String passName);
+    void ReleaseShaders();
+    tolua_outside Technique* TechniqueClone @ Clone(const String cloneName = String::EMPTY) const;
+
     bool HasPass(const String type) const;
     Pass* GetPass(const String type) const;
     Pass* GetSupportedPass(const String type) const;
@@ -46,4 +82,16 @@ static const PODVector<Pass*>& TechniqueGetPasses(const Technique* technique)
     static PODVector<Pass*> vector = technique->GetPasses();
     return vector;
 }
+
+static Technique* TechniqueClone(const Technique* technique, const String& cloneName = String::EMPTY)
+{
+    if (!technique)
+        return 0;
+        
+    SharedPtr<Technique> clonedTechniquePtr = technique->Clone(cloneName);
+    Technique* clonedTechnique = clonedTechniquePtr.Get();
+    clonedTechniquePtr.Detach();
+    
+    return clonedTechnique;
+}
 $}