| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- #include "BsScriptComponent.h"
- #include "BsScriptGameObjectManager.h"
- #include "BsScriptMeta.h"
- #include "BsMonoField.h"
- #include "BsMonoClass.h"
- #include "BsMonoManager.h"
- #include "BsMonoUtil.h"
- #include "BsScriptSceneObject.h"
- #include "BsManagedComponent.h"
- #include "BsSceneObject.h"
- namespace BansheeEngine
- {
- ScriptComponent::ScriptComponent(MonoObject* instance, const GameObjectHandle<ManagedComponent>& managedComponent)
- :ScriptObject(instance), mManagedComponent(managedComponent)
- { }
- void ScriptComponent::initRuntimeData()
- {
- metaData.scriptClass->addInternalCall("Internal_AddComponent", &ScriptComponent::internal_addComponent);
- metaData.scriptClass->addInternalCall("Internal_GetComponent", &ScriptComponent::internal_getComponent);
- metaData.scriptClass->addInternalCall("Internal_GetComponents", &ScriptComponent::internal_getComponents);
- metaData.scriptClass->addInternalCall("Internal_RemoveComponent", &ScriptComponent::internal_removeComponent);
- }
- MonoObject* ScriptComponent::internal_addComponent(MonoObject* parentSceneObject, MonoReflectionType* type)
- {
- ScriptSceneObject* scriptSO = ScriptSceneObject::toNative(parentSceneObject);
- HSceneObject so = static_object_cast<SceneObject>(scriptSO->getNativeHandle());
- // We only allow single component per type
- const Vector<HComponent>& mComponents = so->getComponents();
- for(auto& component : mComponents)
- {
- if(component->getTypeId() == TID_ManagedComponent)
- {
- GameObjectHandle<ManagedComponent> managedComponent = static_object_cast<ManagedComponent>(component);
- if(managedComponent->getRuntimeType() == type)
- {
- LOGWRN("Attempting to add a component that already exists on SceneObject \"" + so->getName() + "\"");
- return managedComponent->getManagedInstance();
- }
- }
- }
- GameObjectHandle<ManagedComponent> mc = so->addComponent<ManagedComponent>(type);
- ScriptComponent* nativeInstance = ScriptGameObjectManager::instance().createScriptComponent(mc);
-
- return nativeInstance->getManagedInstance();
- }
- MonoObject* ScriptComponent::internal_getComponent(MonoObject* parentSceneObject, MonoReflectionType* type)
- {
- ScriptSceneObject* scriptSO = ScriptSceneObject::toNative(parentSceneObject);
- HSceneObject so = static_object_cast<SceneObject>(scriptSO->getNativeHandle());
- const Vector<HComponent>& mComponents = so->getComponents();
- for(auto& component : mComponents)
- {
- if(component->getTypeId() == TID_ManagedComponent)
- {
- GameObjectHandle<ManagedComponent> managedComponent = static_object_cast<ManagedComponent>(component);
- if(managedComponent->getRuntimeType() == type)
- {
- return managedComponent->getManagedInstance();
- }
- }
- }
- return nullptr;
- }
- MonoArray* ScriptComponent::internal_getComponents(MonoObject* parentSceneObject)
- {
- ScriptSceneObject* scriptSO = ScriptSceneObject::toNative(parentSceneObject);
- HSceneObject so = static_object_cast<SceneObject>(scriptSO->getNativeHandle());
- const Vector<HComponent>& mComponents = so->getComponents();
- Vector<MonoObject*> managedComponents;
- for(auto& component : mComponents)
- {
- if(component->getTypeId() == TID_ManagedComponent)
- {
- GameObjectHandle<ManagedComponent> managedComponent = static_object_cast<ManagedComponent>(component);
- managedComponents.push_back(managedComponent->getManagedInstance());
- }
- }
- MonoArray* componentArray = mono_array_new(MonoManager::instance().getDomain(),
- metaData.scriptClass->_getInternalClass(), (UINT32)managedComponents.size());
- for(UINT32 i = 0; i < (UINT32)managedComponents.size(); i++)
- {
- void* elemAddr = mono_array_addr_with_size(componentArray, sizeof(MonoObject*), i);
- memcpy(elemAddr, &managedComponents[i], sizeof(MonoObject*));
- }
- return componentArray;
- }
- void ScriptComponent::internal_removeComponent(MonoObject* parentSceneObject, MonoReflectionType* type)
- {
- ScriptSceneObject* scriptSO = ScriptSceneObject::toNative(parentSceneObject);
- HSceneObject so = static_object_cast<SceneObject>(scriptSO->getNativeHandle());
- // We only allow single component per type
- const Vector<HComponent>& mComponents = so->getComponents();
- for(auto& component : mComponents)
- {
- if(component->getTypeId() == TID_ManagedComponent)
- {
- GameObjectHandle<ManagedComponent> managedComponent = static_object_cast<ManagedComponent>(component);
- if(managedComponent->getRuntimeType() == type)
- {
- managedComponent->destroy();
- return;
- }
- }
- }
- LOGWRN("Attempting to remove a component that doesn't exists on SceneObject \"" + so->getName() + "\"");
- }
- void ScriptComponent::_onManagedInstanceDeleted()
- {
- mManagedInstance = nullptr;
- ScriptGameObjectManager::instance().destroyScriptGameObject(this);
- }
- void ScriptComponent::setNativeHandle(const HGameObject& gameObject)
- {
- mManagedComponent = static_object_cast<ManagedComponent>(gameObject);
- }
- }
|