Game Development Community

Exception when registering the second clone of a template when a CollisionShape has been added

by Trent · in Torque X 3D · 12/21/2009 (9:21 pm) · 2 replies

I have a template I made in which I have a few simple components (scene, T3DBox, rigid), but as soon as I add a collision sphere to my rigid component I get the exception below when creating the second instance of the template. The first instance just doesn't show up. It seems to be having trouble registering the T3DBox in the scene group, _sceneClientList is null.

System.NullReferenceException was unhandled
Message="Object reference not set to an instance of an object."
Source="GarageGames.TorqueX.Framework3D"
StackTrace:
at GarageGames.Torque.T3D.T3DSceneComponent.RemoveClientObject(T3DSceneClient sceneClient) in C:TrentProjectsXNATXTXTorque3DT3DComponentsT3DSceneComponent.cs:line 577
at GarageGames.Torque.T3D.T3DSceneClient.set_SceneGroupName(String value) in C:TrentProjectsXNATXTXTorque3DT3DComponentsT3DSceneClient.cs:line 65
at GarageGames.Torque.T3D.T3DSceneClient._OnRegister(TorqueObject owner) in C:TrentProjectsXNATXTXTorque3DT3DComponentsT3DSceneClient.cs:line 117
at GarageGames.Torque.T3D.T3DBox._OnRegister(TorqueObject owner) in C:TrentProjectsXNATXTXTorque3DT3DComponentsT3DPrimitiveComponents.cs:line 223
at GarageGames.Torque.Core.TorqueComponentContainer._RegisterComponents(TorqueObject owner) in C:TrentProjectsXNATXTXTorqueCoreCoreTorqueComponent.cs:line 444
at GarageGames.Torque.Core.TorqueObject.OnRegister() in C:TrentProjectsXNATXTXTorqueCoreCoreTorqueObject.cs:line 581
at GarageGames.Torque.Core.TorqueObjectDatabase.Register(TorqueObject obj) in C:TrentProjectsXNATXTXTorqueCoreCoreTorqueObjectDatabase.cs:line 384
at GarageGames.Torque.Core.TorqueObjectDatabase.CreateFromTemplate(String templateName) in C:TrentProjectsXNATXTXTorqueCoreCoreTorqueObjectDatabase.cs:line 541
at Storm.PlayerControlComponent.FireWeapon() in C:TrentProjectsXNATXTXGameComponentsPlayerControlComponent.cs:line 310
at GarageGames.Torque.Sim.InputMap.ProcessInput(InputEventData data) in C:TrentProjectsXNATXTXTorqueCoreSimInputMap.cs:line 533
at GarageGames.Torque.Sim.InputManager.ProcessInputEvent(String eventName, InputEventData inputData) in C:TrentProjectsXNATXTXTorqueCoreSimInputManager.cs:line 641
at GarageGames.Torque.Core.TorqueEvent`1._Trigger(Delegate d) in C:TrentProjectsXNATXTXTorqueCoreCoreTorqueEvent.cs:line 85
at GarageGames.Torque.Core.TorqueEventManager._TriggerEvent(TorqueEventBase ev) in C:TrentProjectsXNATXTXTorqueCoreCoreTorqueEvent.cs:line 636
at GarageGames.Torque.Core.TorqueEventManager.MgrProcessEvents() in C:TrentProjectsXNATXTXTorqueCoreCoreTorqueEvent.cs:line 477
at GarageGames.Torque.Core.TorqueEventManager.ProcessEvents() in C:TrentProjectsXNATXTXTorqueCoreCoreTorqueEvent.cs:line 315
at GarageGames.Torque.XNA.TorqueEngineComponent.Update(GameTime gameTime) in C:TrentProjectsXNATXTXTorqueCoreXNATorqueEngineComponent.cs:line 484
at Microsoft.Xna.Framework.Game.Update(GameTime gameTime)
at Microsoft.Xna.Framework.Game.Tick()
at Microsoft.Xna.Framework.Game.HostIdle(Object sender, EventArgs e)
at Microsoft.Xna.Framework.GameHost.OnIdle()
at Microsoft.Xna.Framework.WindowsGameHost.ApplicationIdle(Object sender, EventArgs e)
at System.Windows.Forms.Application.ThreadContext.System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FDoIdle(Int32 grfidlef)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at Microsoft.Xna.Framework.WindowsGameHost.Run()
at Microsoft.Xna.Framework.Game.Run()
at Storm.Game.Main() in C:TrentProjectsXNATXTXGameGame.cs:line 55
InnerException:

#1
12/22/2009 (8:16 am)
It has something to do with calling Owner.MarkForDelete, possibly from a component of the object being deleted. Any time I comment out this line I don't get the error.

Scratch that, happens even outside that :/
#2
12/22/2009 (5:34 pm)
Ok I believe I have found the source of the error. Once the first cloned object from the template has been marked for delete, cloning a new object fails. I notice that in John's book his projectile code only marks the enemy for delete, not the projectile.

Are we not meant to delete cloned & pooled objects?