diff --git a/Engine/source/T3D/assets/GameObjectAsset.cpp b/Engine/source/T3D/assets/GameObjectAsset.cpp
index 45b33b086..85bfce456 100644
--- a/Engine/source/T3D/assets/GameObjectAsset.cpp
+++ b/Engine/source/T3D/assets/GameObjectAsset.cpp
@@ -139,6 +139,44 @@ void GameObjectAsset::onAssetRefresh()
Con::executeFile(mScriptFilePath, false, false);
}
+const char* GameObjectAsset::create()
+{
+ if (!Platform::isFile(mTAMLFilePath))
+ return "";
+
+ // Set the format mode.
+ Taml taml;
+
+ // Yes, so set it.
+ taml.setFormatMode(Taml::getFormatModeEnum("xml"));
+
+ // Turn-off auto-formatting.
+ taml.setAutoFormat(false);
+
+ // Read object.
+ SimObject* pSimObject = taml.read(mTAMLFilePath);
+
+ // Did we find the object?
+ if (pSimObject == NULL)
+ {
+ // No, so warn.
+ Con::warnf("GameObjectAsset::create() - Could not read object from file '%s'.", mTAMLFilePath);
+ return "";
+ }
+
+ //Flag it so we know where it came from
+ pSimObject->setDataField("GameObject", nullptr, getAssetId());
+
+ return pSimObject->getIdString();
+}
+
+DefineEngineMethod(GameObjectAsset, createObject, const char*, (),,
+ "Creates an instance of the given GameObject given the asset definition.\n"
+ "@return The GameObject entity created from the asset.")
+{
+ return object->create();
+}
+
//-----------------------------------------------------------------------------
// GuiInspectorTypeAssetId
//-----------------------------------------------------------------------------
@@ -161,34 +199,50 @@ void GuiInspectorTypeGameObjectAssetPtr::consoleInit()
GuiControl* GuiInspectorTypeGameObjectAssetPtr::constructEditControl()
{
// Create base filename edit controls
- GuiControl *retCtrl = Parent::constructEditControl();
- if (retCtrl == NULL)
- return retCtrl;
+ // Create "Open in ShapeEditor" button
+ mGameObjectEditButton = new GuiButtonCtrl();
// Change filespec
char szBuffer[512];
- dSprintf(szBuffer, sizeof(szBuffer), "AssetBrowser.showDialog(\"GameObjectAsset\", \"AssetBrowser.changeAsset\", %d, %s);",
- mInspector->getComponentGroupTargetId(), mCaption);
- mBrowseButton->setField("Command", szBuffer);
+ dSprintf(szBuffer, sizeof(szBuffer), "%d.onClick(%s);", this->getId(), mCaption);
+ mGameObjectEditButton->setField("Command", szBuffer);
- // Create "Open in ShapeEditor" button
- mSMEdButton = new GuiBitmapButtonCtrl();
+ mGameObjectEditButton->setDataField(StringTable->insert("Profile"), NULL, "GuiButtonProfile");
+ mGameObjectEditButton->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile");
+ mGameObjectEditButton->setDataField(StringTable->insert("hovertime"), NULL, "1000");
- dSprintf(szBuffer, sizeof(szBuffer), "echo(\"Game Object Editor not implemented yet!\");", retCtrl->getId());
- mSMEdButton->setField("Command", szBuffer);
+ const char* assetId = getData();
- char bitmapName[512] = "tools/worldEditor/images/toolbar/shape-editor";
- mSMEdButton->setBitmap(bitmapName);
+ if (assetId == "")
+ {
+ mGameObjectEditButton->setText("Create Game Object");
- mSMEdButton->setDataField(StringTable->insert("Profile"), NULL, "GuiButtonProfile");
- mSMEdButton->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile");
- mSMEdButton->setDataField(StringTable->insert("hovertime"), NULL, "1000");
- mSMEdButton->setDataField(StringTable->insert("tooltip"), NULL, "Open this file in the State Machine Editor");
+ mGameObjectEditButton->setDataField(StringTable->insert("tooltip"), NULL, "Convert this object into a reusable Game Object asset.");
+ }
+ else
+ {
+ GameObjectAsset* goAsset = AssetDatabase.acquireAsset< GameObjectAsset>(assetId);
- mSMEdButton->registerObject();
- addObject(mSMEdButton);
+ if (goAsset)
+ {
+ mGameObjectEditButton->setText("Edit Game Object");
- return retCtrl;
+ mGameObjectEditButton->setDataField(StringTable->insert("tooltip"), NULL, "Edit this object instance or Game Object asset.");
+ }
+ else
+ {
+ mGameObjectEditButton->setText("Create Game Object");
+
+ mGameObjectEditButton->setDataField(StringTable->insert("tooltip"), NULL, "Convert this object into a reusable Game Object asset.");
+ }
+ }
+
+ //mGameObjectEditButton->registerObject();
+ _registerEditControl(mGameObjectEditButton);
+
+ addObject(mGameObjectEditButton);
+
+ return mGameObjectEditButton;
}
bool GuiInspectorTypeGameObjectAssetPtr::updateRects()
@@ -199,19 +253,12 @@ bool GuiInspectorTypeGameObjectAssetPtr::updateRects()
Point2I fieldPos = getPosition();
mCaptionRect.set(0, 0, fieldExtent.x - dividerPos - dividerMargin, fieldExtent.y);
- mEditCtrlRect.set(fieldExtent.x - dividerPos + dividerMargin, 1, dividerPos - dividerMargin - 34, fieldExtent.y);
+ mEditCtrlRect.set(fieldExtent.x - dividerPos + dividerMargin, 1, dividerPos - dividerMargin, fieldExtent.y);
bool resized = mEdit->resize(mEditCtrlRect.point, mEditCtrlRect.extent);
- if (mBrowseButton != NULL)
+ if (mGameObjectEditButton != NULL)
{
- mBrowseRect.set(fieldExtent.x - 32, 2, 14, fieldExtent.y - 4);
- resized |= mBrowseButton->resize(mBrowseRect.point, mBrowseRect.extent);
- }
-
- if (mSMEdButton != NULL)
- {
- RectI shapeEdRect(fieldExtent.x - 16, 2, 14, fieldExtent.y - 4);
- resized |= mSMEdButton->resize(shapeEdRect.point, shapeEdRect.extent);
+ resized |= mGameObjectEditButton->resize(mEditCtrlRect.point, mEditCtrlRect.extent);
}
return resized;
diff --git a/Engine/source/T3D/assets/GameObjectAsset.h b/Engine/source/T3D/assets/GameObjectAsset.h
index 954a11300..fdbb7c61c 100644
--- a/Engine/source/T3D/assets/GameObjectAsset.h
+++ b/Engine/source/T3D/assets/GameObjectAsset.h
@@ -59,6 +59,8 @@ public:
static void initPersistFields();
virtual void copyTo(SimObject* object);
+ const char* create();
+
/// Declare Console Object.
DECLARE_CONOBJECT(GameObjectAsset);
@@ -73,12 +75,12 @@ DefineConsoleType(TypeGameObjectAssetPtr, GameObjectAsset)
//-----------------------------------------------------------------------------
// TypeAssetId GuiInspectorField Class
//-----------------------------------------------------------------------------
-class GuiInspectorTypeGameObjectAssetPtr : public GuiInspectorTypeFileName
+class GuiInspectorTypeGameObjectAssetPtr : public GuiInspectorField
{
- typedef GuiInspectorTypeFileName Parent;
+ typedef GuiInspectorField Parent;
public:
- GuiBitmapButtonCtrl *mSMEdButton;
+ GuiButtonCtrl *mGameObjectEditButton;
DECLARE_CONOBJECT(GuiInspectorTypeGameObjectAssetPtr);
static void consoleInit();
diff --git a/Engine/source/T3D/gameObjects/aiPlayerObject.cpp b/Engine/source/T3D/gameObjects/aiPlayerObject.cpp
new file mode 100644
index 000000000..2eca3e0b8
--- /dev/null
+++ b/Engine/source/T3D/gameObjects/aiPlayerObject.cpp
@@ -0,0 +1,42 @@
+#include "aiPlayerObject.h"
+
+IMPLEMENT_CO_NETOBJECT_V1(AIPlayerObject);
+
+AIPlayerObject::AIPlayerObject()
+ : mAIControllerComponent(nullptr)
+{
+
+}
+AIPlayerObject::~AIPlayerObject()
+{
+
+}
+
+bool AIPlayerObject::onAdd()
+{
+ if (!Parent::onAdd())
+ return false;
+
+ //If we don't delinate from the template, just spawn as apropos here
+ if (!mDirtyGameObject)
+ {
+ //AI Controller
+ mAIControllerComponent = new AIControllerComponent();
+ if (!mAIControllerComponent->registerObject())
+ {
+ Con::errorf("PlayerObject::onAdd - unable to add mAIControllerComponent!");
+ return false;
+ }
+
+ mAIControllerComponent->setInternalName("aiControllerComponent");
+
+ addComponent(mAIControllerComponent);
+ }
+
+ return true;
+}
+
+void AIPlayerObject::onRemove()
+{
+ Parent::onRemove();
+}
\ No newline at end of file
diff --git a/Engine/source/T3D/gameObjects/aiPlayerObject.h b/Engine/source/T3D/gameObjects/aiPlayerObject.h
new file mode 100644
index 000000000..72aeb3ff0
--- /dev/null
+++ b/Engine/source/T3D/gameObjects/aiPlayerObject.h
@@ -0,0 +1,20 @@
+#pragma once
+#include "playerObject.h"
+
+#include "T3D/components/ai/aiControllerComponent.h"
+
+class AIPlayerObject : public PlayerObject
+{
+ typedef PlayerObject Parent;
+
+ AIControllerComponent* mAIControllerComponent;
+
+public:
+ AIPlayerObject();
+ ~AIPlayerObject();
+
+ virtual bool onAdd();
+ virtual void onRemove();
+
+ DECLARE_CONOBJECT(AIPlayerObject);
+};
\ No newline at end of file
diff --git a/Engine/source/T3D/gameObjects/playerObject.cpp b/Engine/source/T3D/gameObjects/playerObject.cpp
new file mode 100644
index 000000000..1ee38bf3a
--- /dev/null
+++ b/Engine/source/T3D/gameObjects/playerObject.cpp
@@ -0,0 +1,165 @@
+#include "playerObject.h"
+
+IMPLEMENT_CO_NETOBJECT_V1(PlayerObject);
+
+PlayerObject::PlayerObject()
+ : mMeshComponent(nullptr),
+ mCollisionComponent(nullptr),
+ mAnimationComponent(nullptr),
+ mPhysicsComponent(nullptr)
+{
+
+}
+PlayerObject::~PlayerObject()
+{
+
+}
+
+bool PlayerObject::onAdd()
+{
+ if (!Parent::onAdd())
+ return false;
+
+ //If we don't delinate from the template, just spawn as apropos here
+ if (!mDirtyGameObject)
+ {
+ //Mesh
+ mMeshComponent = new MeshComponent();
+ if (!mMeshComponent->registerObject())
+ {
+ Con::errorf("PlayerObject::onAdd - unable to add MeshComponent!");
+ return false;
+ }
+
+ mMeshComponent->setInternalName("meshComponent");
+
+ addComponent(mMeshComponent);
+
+ //Collision
+ mCollisionComponent = new ShapeCollisionComponent();
+ if (!mCollisionComponent->registerObject())
+ {
+ Con::errorf("PlayerObject::onAdd - unable to add ShapeCollisionComponent!");
+ return false;
+ }
+
+ mCollisionComponent->setInternalName("collisionComponent");
+
+ addComponent(mCollisionComponent);
+
+ //Animation
+ mAnimationComponent = new ActionAnimationComponent();
+ if (!mAnimationComponent->registerObject())
+ {
+ Con::errorf("PlayerObject::onAdd - unable to add ActionAnimationComponent!");
+ return false;
+ }
+
+ mAnimationComponent->setInternalName("animationComponent");
+
+ addComponent(mAnimationComponent);
+
+ //Arm Animation
+ mArmAnimationComponent = new ArmAnimationComponent();
+ if (!mArmAnimationComponent->registerObject())
+ {
+ Con::errorf("PlayerObject::onAdd - unable to add ArmAnimationComponent!");
+ return false;
+ }
+
+ mArmAnimationComponent->setInternalName("armAnimationComponent");
+
+ addComponent(mArmAnimationComponent);
+
+ //Physics control
+ mPhysicsComponent = new PlayerControllerComponent();
+ if (!mPhysicsComponent->registerObject())
+ {
+ Con::errorf("PlayerObject::onAdd - unable to add PhysicsComponent!");
+ return false;
+ }
+
+ mPhysicsComponent->setInternalName("physicsComponent");
+
+ addComponent(mPhysicsComponent);
+
+ //State Machine
+ mStateMachineComponent = new StateMachineComponent();
+ if (!mStateMachineComponent->registerObject())
+ {
+ Con::errorf("PlayerObject::onAdd - unable to add StateMachineComponent!");
+ return false;
+ }
+
+ mStateMachineComponent->setInternalName("stateMachineComponent");
+
+ addComponent(mStateMachineComponent);
+
+ //Camera
+ mCameraComponent = new CameraComponent();
+ if (!mCameraComponent->registerObject())
+ {
+ Con::errorf("PlayerObject::onAdd - unable to add CameraComponent!");
+ return false;
+ }
+
+ mCameraComponent->setInternalName("cameraComponent");
+
+ addComponent(mCameraComponent);
+
+ //Camera Orbiter
+ mCameraOrbiterComponent = new CameraOrbiterComponent();
+ if (!mCameraOrbiterComponent->registerObject())
+ {
+ Con::errorf("PlayerObject::onAdd - unable to add CameraOrbiterComponent!");
+ return false;
+ }
+
+ mCameraOrbiterComponent->setInternalName("cameraOrbiterComponent");
+
+ addComponent(mCameraOrbiterComponent);
+
+ //Control Object
+ mControlObjectComponent = new ControlObjectComponent();
+ if (!mControlObjectComponent->registerObject())
+ {
+ Con::errorf("PlayerObject::onAdd - unable to add ControlObjectComponent!");
+ return false;
+ }
+
+ mControlObjectComponent->setInternalName("controlObjectComponent");
+
+ addComponent(mControlObjectComponent);
+
+ //Sound
+ mSoundComponent = new SoundComponent();
+ if (!mSoundComponent->registerObject())
+ {
+ Con::errorf("PlayerObject::onAdd - unable to add SoundComponent!");
+ return false;
+ }
+
+ mSoundComponent->setInternalName("soundComponent");
+
+ addComponent(mSoundComponent);
+
+ //Interaction
+ mInteractComponent = new InteractComponent();
+ if (!mInteractComponent->registerObject())
+ {
+ Con::errorf("PlayerObject::onAdd - unable to add InteractComponent!");
+ return false;
+ }
+
+ mInteractComponent->setInternalName("interactComponent");
+
+ addComponent(mInteractComponent);
+ }
+
+ return true;
+}
+
+void PlayerObject::onRemove()
+{
+ Parent::onRemove();
+}
\ No newline at end of file
diff --git a/Engine/source/T3D/gameObjects/playerObject.h b/Engine/source/T3D/gameObjects/playerObject.h
new file mode 100644
index 000000000..8c089f77b
--- /dev/null
+++ b/Engine/source/T3D/gameObjects/playerObject.h
@@ -0,0 +1,40 @@
+#pragma once
+
+#include "T3D/entity.h"
+#include "T3D/components/render/meshComponent.h"
+#include "T3D/components/collision/shapeCollisionComponent.h"
+#include "T3D/components/animation/actionAnimationComponent.h"
+#include "T3D/components/animation/armAnimationComponent.h"
+#include "T3D/components/physics/playerControllerComponent.h"
+#include "T3D/components/game/stateMachineComponent.h"
+#include "T3D/components/camera/cameraComponent.h"
+#include "T3D/components/camera/cameraOrbiterComponent.h"
+#include "T3D/components/game/controlObjectComponent.h"
+#include "T3D/components/audio/soundComponent.h"
+#include "T3D/components/game/interactComponent.h"
+
+class PlayerObject : public Entity
+{
+ typedef Entity Parent;
+
+ MeshComponent* mMeshComponent;
+ ShapeCollisionComponent* mCollisionComponent;
+ ActionAnimationComponent* mAnimationComponent;
+ ArmAnimationComponent* mArmAnimationComponent;
+ PlayerControllerComponent* mPhysicsComponent;
+ StateMachineComponent* mStateMachineComponent;
+ CameraComponent* mCameraComponent;
+ CameraOrbiterComponent* mCameraOrbiterComponent;
+ ControlObjectComponent* mControlObjectComponent;
+ SoundComponent* mSoundComponent;
+ InteractComponent* mInteractComponent;
+
+public:
+ PlayerObject();
+ ~PlayerObject();
+
+ virtual bool onAdd();
+ virtual void onRemove();
+
+ DECLARE_CONOBJECT(PlayerObject);
+};
\ No newline at end of file
diff --git a/Engine/source/T3D/gameObjects/soundEmitterObject.cpp b/Engine/source/T3D/gameObjects/soundEmitterObject.cpp
new file mode 100644
index 000000000..2ce1eeafb
--- /dev/null
+++ b/Engine/source/T3D/gameObjects/soundEmitterObject.cpp
@@ -0,0 +1,38 @@
+#include "SoundEmitterObject.h"
+
+IMPLEMENT_CO_NETOBJECT_V1(SoundEmitterObject);
+
+SoundEmitterObject::SoundEmitterObject()
+ : mSoundComponent(nullptr)
+{
+
+}
+SoundEmitterObject::~SoundEmitterObject()
+{
+
+}
+
+bool SoundEmitterObject::onAdd()
+{
+ if (!Parent::onAdd())
+ return false;
+
+ //Sound
+ mSoundComponent = new SoundComponent();
+ if (!mSoundComponent->registerObject())
+ {
+ Con::errorf("SoundEmitterObject::onAdd - unable to add soundComponent!");
+ return false;
+ }
+
+ mSoundComponent->setInternalName("soundComponent");
+
+ addComponent(mSoundComponent);
+
+ return true;
+}
+
+void SoundEmitterObject::onRemove()
+{
+ Parent::onRemove();
+}
\ No newline at end of file
diff --git a/Engine/source/T3D/gameObjects/soundEmitterObject.h b/Engine/source/T3D/gameObjects/soundEmitterObject.h
new file mode 100644
index 000000000..f877ced1c
--- /dev/null
+++ b/Engine/source/T3D/gameObjects/soundEmitterObject.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#include "T3D/entity.h"
+#include "T3D/components/audio/soundComponent.h"
+
+class SoundEmitterObject : public Entity
+{
+ typedef Entity Parent;
+
+ SoundComponent* mSoundComponent;
+
+public:
+ SoundEmitterObject();
+ ~SoundEmitterObject();
+
+ virtual bool onAdd();
+ virtual void onRemove();
+
+ DECLARE_CONOBJECT(SoundEmitterObject);
+};
\ No newline at end of file
diff --git a/Engine/source/T3D/gameObjects/staticShapeObject.cpp b/Engine/source/T3D/gameObjects/staticShapeObject.cpp
new file mode 100644
index 000000000..037e089b1
--- /dev/null
+++ b/Engine/source/T3D/gameObjects/staticShapeObject.cpp
@@ -0,0 +1,68 @@
+#include "staticShapeObject.h"
+
+IMPLEMENT_CO_NETOBJECT_V1(StaticShapeObject);
+
+StaticShapeObject::StaticShapeObject()
+ : mMeshComponent(nullptr),
+ mCollisionComponent(nullptr),
+ mAnimationComponent(nullptr)
+{
+
+}
+StaticShapeObject::~StaticShapeObject()
+{
+
+}
+
+bool StaticShapeObject::onAdd()
+{
+ if (!Parent::onAdd())
+ return false;
+
+ //If we don't delinate from the template, just spawn as apropos here
+ if (!mDirtyGameObject)
+ {
+ //Mesh
+ mMeshComponent = new MeshComponent();
+ if (!mMeshComponent->registerObject())
+ {
+ Con::errorf("StaticShapeObject::onAdd - unable to add MeshComponent!");
+ return false;
+ }
+
+ mMeshComponent->setInternalName("meshComponent");
+
+ addComponent(mMeshComponent);
+
+ //Collision
+ mCollisionComponent = new ShapeCollisionComponent();
+ if (!mCollisionComponent->registerObject())
+ {
+ Con::errorf("StaticShapeObject::onAdd - unable to add ShapeCollisionComponent!");
+ return false;
+ }
+
+ mCollisionComponent->setInternalName("collisionComponent");
+
+ addComponent(mCollisionComponent);
+
+ //Animation
+ mAnimationComponent = new AnimationComponent();
+ if (!mAnimationComponent->registerObject())
+ {
+ Con::errorf("StaticShapeObject::onAdd - unable to add AnimationComponent!");
+ return false;
+ }
+
+ mAnimationComponent->setInternalName("animationComponent");
+
+ addComponent(mAnimationComponent);
+ }
+
+ return true;
+}
+
+void StaticShapeObject::onRemove()
+{
+ Parent::onRemove();
+}
\ No newline at end of file
diff --git a/Engine/source/T3D/gameObjects/staticShapeObject.h b/Engine/source/T3D/gameObjects/staticShapeObject.h
new file mode 100644
index 000000000..b13e4efb8
--- /dev/null
+++ b/Engine/source/T3D/gameObjects/staticShapeObject.h
@@ -0,0 +1,28 @@
+#pragma once
+
+#include "T3D/entity.h"
+#include "T3D/components/render/meshComponent.h"
+#include "T3D/components/collision/shapeCollisionComponent.h"
+#include "T3D/components/animation/animationComponent.h"
+
+class StaticShapeObject : public Entity
+{
+ typedef Entity Parent;
+
+ MeshComponent* mMeshComponent;
+ ShapeCollisionComponent* mCollisionComponent;
+ AnimationComponent* mAnimationComponent;
+
+public:
+ StaticShapeObject();
+ ~StaticShapeObject();
+
+ virtual bool onAdd();
+ virtual void onRemove();
+
+ MeshComponent* getMeshComponent() { return mMeshComponent; }
+ ShapeCollisionComponent* getCollisionComponent() { return mCollisionComponent; }
+ AnimationComponent* getAnimationComponent() { return mAnimationComponent; }
+
+ DECLARE_CONOBJECT(StaticShapeObject);
+};
\ No newline at end of file
diff --git a/Templates/BaseGame/game/core/gameObjects/Core_GameObjects.cs b/Templates/BaseGame/game/core/gameObjects/Core_GameObjects.cs
new file mode 100644
index 000000000..204352142
--- /dev/null
+++ b/Templates/BaseGame/game/core/gameObjects/Core_GameObjects.cs
@@ -0,0 +1,8 @@
+
+function Core_GameObjects::onCreate(%this)
+{
+}
+
+function Core_GameObjects::onDestroy(%this)
+{
+}
\ No newline at end of file
diff --git a/Templates/BaseGame/game/core/gameObjects/Core_GameObjects.module b/Templates/BaseGame/game/core/gameObjects/Core_GameObjects.module
new file mode 100644
index 000000000..48c225a50
--- /dev/null
+++ b/Templates/BaseGame/game/core/gameObjects/Core_GameObjects.module
@@ -0,0 +1,19 @@
+
+
+
+
\ No newline at end of file
diff --git a/Templates/BaseGame/game/core/gameObjects/gameObjects/AIPlayerObject.asset.taml b/Templates/BaseGame/game/core/gameObjects/gameObjects/AIPlayerObject.asset.taml
new file mode 100644
index 000000000..f8b4829c6
--- /dev/null
+++ b/Templates/BaseGame/game/core/gameObjects/gameObjects/AIPlayerObject.asset.taml
@@ -0,0 +1,8 @@
+
diff --git a/Templates/BaseGame/game/core/gameObjects/gameObjects/AIPlayerObject.cs b/Templates/BaseGame/game/core/gameObjects/gameObjects/AIPlayerObject.cs
new file mode 100644
index 000000000..28de417e6
--- /dev/null
+++ b/Templates/BaseGame/game/core/gameObjects/gameObjects/AIPlayerObject.cs
@@ -0,0 +1,42 @@
+function AIPlayerObject::onAdd(%this)
+{
+
+}
+
+function AIPlayerObject::onRemove(%this)
+{
+
+}
+
+function AIPlayerObject::moveVectorEvent(%this)
+{
+
+}
+
+function AIPlayerObject::moveYawEvent(%this)
+{
+
+}
+
+function AIPlayerObject::movePitchEvent(%this)
+{
+
+}
+
+function AIPlayerObject::moveRollEvent(%this){}
+
+function AIPlayerObject::moveTriggerEvent(%this, %triggerNum, %triggerValue)
+{
+
+}
+
+function AIPlayerObject::onCollisionEvent(%this, %colObject, %colNormal, %colPoint, %colMatID, %velocity)
+{
+
+}
+
+function AIPlayerObject::processTick(%this)
+{
+
+}
+
diff --git a/Templates/BaseGame/game/core/gameObjects/gameObjects/AIPlayerObject.taml b/Templates/BaseGame/game/core/gameObjects/gameObjects/AIPlayerObject.taml
new file mode 100644
index 000000000..e2abaf30b
--- /dev/null
+++ b/Templates/BaseGame/game/core/gameObjects/gameObjects/AIPlayerObject.taml
@@ -0,0 +1,12 @@
+
+
diff --git a/Templates/BaseGame/game/core/gameObjects/gameObjects/PlayerObject.asset.taml b/Templates/BaseGame/game/core/gameObjects/gameObjects/PlayerObject.asset.taml
new file mode 100644
index 000000000..67c2b6e1d
--- /dev/null
+++ b/Templates/BaseGame/game/core/gameObjects/gameObjects/PlayerObject.asset.taml
@@ -0,0 +1,8 @@
+
diff --git a/Templates/BaseGame/game/core/gameObjects/gameObjects/PlayerObject.cs b/Templates/BaseGame/game/core/gameObjects/gameObjects/PlayerObject.cs
new file mode 100644
index 000000000..d5593b15d
--- /dev/null
+++ b/Templates/BaseGame/game/core/gameObjects/gameObjects/PlayerObject.cs
@@ -0,0 +1,42 @@
+function PlayerObject::onAdd(%this)
+{
+
+}
+
+function PlayerObject::onRemove(%this)
+{
+
+}
+
+function PlayerObject::moveVectorEvent(%this)
+{
+
+}
+
+function PlayerObject::moveYawEvent(%this)
+{
+
+}
+
+function PlayerObject::movePitchEvent(%this)
+{
+
+}
+
+function PlayerObject::moveRollEvent(%this){}
+
+function PlayerObject::moveTriggerEvent(%this, %triggerNum, %triggerValue)
+{
+
+}
+
+function PlayerObject::onCollisionEvent(%this, %colObject, %colNormal, %colPoint, %colMatID, %velocity)
+{
+
+}
+
+function PlayerObject::processTick(%this)
+{
+
+}
+
diff --git a/Templates/BaseGame/game/core/gameObjects/gameObjects/PlayerObject.taml b/Templates/BaseGame/game/core/gameObjects/gameObjects/PlayerObject.taml
new file mode 100644
index 000000000..e97c086f2
--- /dev/null
+++ b/Templates/BaseGame/game/core/gameObjects/gameObjects/PlayerObject.taml
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Templates/BaseGame/game/core/gameObjects/gameObjects/soundEmitterObject.asset.taml b/Templates/BaseGame/game/core/gameObjects/gameObjects/soundEmitterObject.asset.taml
new file mode 100644
index 000000000..279f4fc6d
--- /dev/null
+++ b/Templates/BaseGame/game/core/gameObjects/gameObjects/soundEmitterObject.asset.taml
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/Templates/BaseGame/game/core/gameObjects/gameObjects/soundEmitterObject.taml b/Templates/BaseGame/game/core/gameObjects/gameObjects/soundEmitterObject.taml
new file mode 100644
index 000000000..e41e48c07
--- /dev/null
+++ b/Templates/BaseGame/game/core/gameObjects/gameObjects/soundEmitterObject.taml
@@ -0,0 +1,9 @@
+
diff --git a/Templates/BaseGame/game/core/gameObjects/gameObjects/staticShapeObject.asset.taml b/Templates/BaseGame/game/core/gameObjects/gameObjects/staticShapeObject.asset.taml
new file mode 100644
index 000000000..659b4c9bb
--- /dev/null
+++ b/Templates/BaseGame/game/core/gameObjects/gameObjects/staticShapeObject.asset.taml
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/Templates/BaseGame/game/core/gameObjects/gameObjects/staticShapeObject.taml b/Templates/BaseGame/game/core/gameObjects/gameObjects/staticShapeObject.taml
new file mode 100644
index 000000000..fc2081704
--- /dev/null
+++ b/Templates/BaseGame/game/core/gameObjects/gameObjects/staticShapeObject.taml
@@ -0,0 +1,9 @@
+
diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/gameObjectCreator.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/gameObjectCreator.cs
index a2c526251..230167daf 100644
--- a/Templates/BaseGame/game/tools/assetBrowser/scripts/gameObjectCreator.cs
+++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/gameObjectCreator.cs
@@ -39,8 +39,7 @@ function GameObjectCreateBtn::onClick(%this)
//also, exec any components that may exist
//find all GameObjectAssets
%assetQuery = new AssetQuery();
- if(!AssetDatabase.findAssetType(%assetQuery, "GameObjectAsset"))
- return; //if we didn't find ANY, just exit
+ AssetDatabase.findAssetType(%assetQuery, "GameObjectAsset");
%count = %assetQuery.getCount();
@@ -69,7 +68,7 @@ function GameObjectCreateBtn::onClick(%this)
//get the selected module data
%moduleName = GameObjectModuleList.getText();
- %selectedEntity.gameObjectAsset = %moduleName @ ":" @ %className;
+ %selectedEntity.gameObject = %moduleName @ ":" @ %className;
%path = "data/" @ %moduleName @ "/gameObjects/";