Browse Source

Merge pull request #1007 from LumaDigital/MB_PortCPPToCS

Fix components in separate dlls being available
JoshEngebretson 9 years ago
parent
commit
64c3dd2964

+ 38 - 16
Script/AtomicNET/AtomicNET/Scene/CSComponentCore.cs

@@ -332,6 +332,21 @@ namespace AtomicEngine
 
 
         }
         }
 
 
+        void HandleComponentAssemblyReference(uint eventType, ScriptVariantMap eventData)
+        {
+#if ATOMIC_DESKTOP || ATOMIC_ANDROID
+            string assemblyPath = eventData["AssemblyPath"];
+
+            string assemblyName = Path.GetFileNameWithoutExtension(assemblyPath);
+            if (componentCache.ContainsKey(assemblyName))
+                return;
+
+            Assembly assembly = Assembly.LoadFrom(assemblyPath);
+
+            ParseAssembly(assembly);
+#endif
+        }
+
         void ParseComponents()
         void ParseComponents()
         {
         {
 #if ATOMIC_DESKTOP || ATOMIC_ANDROID
 #if ATOMIC_DESKTOP || ATOMIC_ANDROID
@@ -340,27 +355,33 @@ namespace AtomicEngine
 
 
             foreach (Assembly assembly in assemblies)
             foreach (Assembly assembly in assemblies)
             {
             {
-                String assemblyPath = assembly.GetName().Name;
+                ParseAssembly(assembly);
+            }
+#endif
+        }
+
+        void ParseAssembly(Assembly assembly)
+        {
+#if ATOMIC_DESKTOP || ATOMIC_ANDROID
+            String assemblyPath = assembly.GetName().Name;
 
 
-                Dictionary<string, CSComponentInfo> assemblyTypes = null;
+            Dictionary<string, CSComponentInfo> assemblyTypes = null;
 
 
-                if (!componentCache.TryGetValue(assemblyPath, out assemblyTypes))
-                {
-                    componentCache[assemblyPath] = assemblyTypes = new Dictionary<string, CSComponentInfo>();
-                }
+            if (!componentCache.TryGetValue(assemblyPath, out assemblyTypes))
+            {
+                componentCache[assemblyPath] = assemblyTypes = new Dictionary<string, CSComponentInfo>();
+            }
 
 
-                Type[] types = assembly.GetTypes();
+            Type[] types = assembly.GetTypes();
 
 
-                foreach (var type in types)
+            foreach (var type in types)
+            {
+                if (type.IsSubclassOf(typeof(CSComponent)))
                 {
                 {
-                    if (type.IsSubclassOf(typeof(CSComponent)))
-                    {
-                        var csinfo = new CSComponentInfo(type);
-                        csinfoLookup[csinfo.Type] = csinfo;
-                        assemblyTypes[type.Name] = csinfo;
-                    }
+                    var csinfo = new CSComponentInfo(type);
+                    csinfoLookup[csinfo.Type] = csinfo;
+                    assemblyTypes[type.Name] = csinfo;
                 }
                 }
-
             }
             }
 #endif
 #endif
         }
         }
@@ -370,7 +391,8 @@ namespace AtomicEngine
 
 
             instance = new CSComponentCore();
             instance = new CSComponentCore();
             instance.ParseComponents();
             instance.ParseComponents();
-            
+
+            instance.SubscribeToEvent("CSComponentAssemblyReference", instance.HandleComponentAssemblyReference);
             instance.SubscribeToEvent("CSComponentLoad", instance.HandleComponentLoad);
             instance.SubscribeToEvent("CSComponentLoad", instance.HandleComponentLoad);
             instance.SubscribeToEvent("Update", instance.HandleUpdate);
             instance.SubscribeToEvent("Update", instance.HandleUpdate);
 
 

+ 6 - 0
Source/Atomic/Graphics/AnimatedModel.cpp

@@ -688,6 +688,12 @@ void AnimatedModel::ResetMorphWeights()
     MarkNetworkUpdate();
     MarkNetworkUpdate();
 }
 }
 
 
+Node* AnimatedModel::GetSkeletonBoneNode(const String & boneName)
+{
+    Bone* bone = skeleton_.GetBone(boneName);
+    return (bone) ? bone->node_ : NULL;
+}
+
 float AnimatedModel::GetMorphWeight(unsigned index) const
 float AnimatedModel::GetMorphWeight(unsigned index) const
 {
 {
     return index < morphs_.Size() ? morphs_[index].weight_ : 0.0f;
     return index < morphs_.Size() ? morphs_[index].weight_ : 0.0f;

+ 2 - 0
Source/Atomic/Graphics/AnimatedModel.h

@@ -99,6 +99,8 @@ public:
 
 
     /// Return skeleton.
     /// Return skeleton.
     Skeleton& GetSkeleton() { return skeleton_; }
     Skeleton& GetSkeleton() { return skeleton_; }
+    /// Return the node of a skeleton bone (for script access)
+    Node* GetSkeletonBoneNode(const String& boneName);
 
 
     /// Return all animation states.
     /// Return all animation states.
     const Vector<SharedPtr<AnimationState> >& GetAnimationStates() const { return animationStates_; }
     const Vector<SharedPtr<AnimationState> >& GetAnimationStates() const { return animationStates_; }