} // CreateDynamicEntityFromModelFilter /// <summary> /// Creates and assign a kinematic entity usign the model stored in the model filter component. /// </summary> public void CreateKinematicEntityFromModelFilter() { ModelFilter modelFilter = ((GameObject3D)Owner).ModelFilter; if (modelFilter != null && modelFilter.Model != null) { ConvexHullShape shape = new ConvexHullShape(modelFilter.Model.Vertices); Entity = new Entity(shape); } else { throw new InvalidOperationException("Rigid Body: Model filter or model not present."); } } // CreateKinematicEntityFromModelFilter
} // Uninitialize #endregion #region Create Static Collidable From Model Filter /// <summary> /// Creates and assign a static mesh usign the model stored in the model filter component. /// </summary> /// <param name="triangleSidedness">A triangle can be double sided, or allow one of its sides to let interacting objects through.</param> public void CreateStaticCollidableFromModelFilter(TriangleSidedness triangleSidedness = TriangleSidedness.Counterclockwise) { ModelFilter modelFilter = ((GameObject3D)Owner).ModelFilter; if (modelFilter != null && modelFilter.Model != null && modelFilter.Model is FileModel) { Vector3[] vertices; int[] indices; TriangleMesh.GetVerticesAndIndicesFromModel(((FileModel)modelFilter.Model).Resource, out vertices, out indices); StaticMesh staticMesh = new StaticMesh(vertices, indices) { Sidedness = triangleSidedness }; StaticCollidable = staticMesh; } else { throw new InvalidOperationException("Static Collider: Model filter not present, model not present or model is not a FileModel."); } } // CreateStaticCollidableFromModelFilter
} // Update #endregion #region Create Entity From Model Filter /// <summary> /// Creates and assign a dynamic entity usign the model stored in the model filter component. /// </summary> public void CreateDynamicEntityFromModelFilter(MotionState motionState, float mass) { ModelFilter modelFilter = ((GameObject3D)Owner).ModelFilter; if (modelFilter != null && modelFilter.Model != null) { // http://bepuphysics.codeplex.com/wikipage?title=Shape%20Recentering ConvexHullShape shape = new ConvexHullShape(modelFilter.Model.Vertices, out offset); // Bepu centers the object in its center of mass. // This offset will be used to match the engine representation. offsetMatrix = Matrix.CreateTranslation(-offset); // To made the interface more uniform the offset will be accounted in the initial motion state. motionState.Position += offset; Entity = new Entity(shape, mass) { MotionState = motionState }; } else { throw new InvalidOperationException("Rigid Body: Model filter or model not present."); } } // CreateDynamicEntityFromModelFilter
} // AddComponent #endregion #region Remove Component /// <summary> /// Removes a component to the game object. /// </summary> /// <remarks> /// A component is not really destroyed, is recycled, it returns to the component pool. /// </remarks> /// <typeparam name="TComponentType">Component Type</typeparam> public override void RemoveComponent <TComponentType>() { #region Transform if (typeof(TComponentType) == typeof(Transform3D)) { throw new ArgumentException("Game Object 3D: Unable to remove the 3D transform component. The transform component can’t be replaced or removed."); } if (typeof(TComponentType) == typeof(Transform2D)) { throw new ArgumentException("Game Object 3D: Unable to remove the 2D transform component. A 3D Game Object does not work in 2D."); } #endregion #region Model Filter if (typeof(TComponentType) == typeof(ModelFilter)) { if (modelFilterAccessor == null) { throw new InvalidOperationException("Game Object 3D: Unable to remove the model filter component. There is not one."); } ModelFilter.Uninitialize(); Components.Remove(ModelFilter); ModelFilter.ComponentPool.Release(modelFilterAccessor); ModelFilter = null; modelFilterAccessor = null; } #endregion #region Model Renderer if (typeof(TComponentType) == typeof(ModelRenderer)) { if (modelRendererAccessor == null) { throw new InvalidOperationException("Game Object 3D: Unable to remove the model renderer component. There is not one."); } ModelRenderer.Uninitialize(); Components.Remove(ModelRenderer); ModelRenderer.ComponentPool.Release(modelRendererAccessor); ModelRenderer = null; modelRendererAccessor = null; } #endregion #region Animation if (typeof(TComponentType) == typeof(RootAnimations)) { if (rootAnimationAccessor == null) { throw new InvalidOperationException("Game Object 3D: Unable to remove the root animation component. There is not one."); } RootAnimations.Uninitialize(); Components.Remove(RootAnimations); RootAnimations.ComponentPool.Release(rootAnimationAccessor); RootAnimations = null; rootAnimationAccessor = null; } if (typeof(TComponentType) == typeof(ModelAnimations)) { if (modelAnimationAccessor == null) { throw new InvalidOperationException("Game Object 3D: Unable to remove the model animation component. There is not one."); } ModelAnimations.Uninitialize(); Components.Remove(ModelAnimations); ModelAnimations.ComponentPool.Release(modelAnimationAccessor); ModelAnimations = null; modelAnimationAccessor = null; } #endregion #region Camera if (typeof(TComponentType) == typeof(Camera)) { if (cameraAccessor == null) { throw new InvalidOperationException("Game Object 3D: Unable to remove the camera component. There is not one."); } Camera.Uninitialize(); Components.Remove(Camera); Camera.ComponentPool.Release(cameraAccessor); Camera = null; cameraAccessor = null; Camera.SortCamerasByRenderingOrder(); } #endregion #region Light if (typeof(Light).IsAssignableFrom(typeof(TComponentType))) { if (Light == null) { throw new InvalidOperationException("Game Object 3D: Unable to remove the light component. There is not one."); } Light.Uninitialize(); if (typeof(TComponentType) == typeof(DirectionalLight)) { DirectionalLight.ComponentPool.Release(directionalLightAccessor); directionalLightAccessor = null; DirectionalLight = null; } else if (typeof(TComponentType) == typeof(PointLight)) { PointLight.ComponentPool.Release(pointLightAccessor); pointLightAccessor = null; PointLight = null; } else if (typeof(TComponentType) == typeof(SpotLight)) { SpotLight.ComponentPool.Release(spotLightAccessor); spotLightAccessor = null; SpotLight = null; } else { throw new InvalidOperationException("Game Object 3D: Unable to remove the light component."); } Components.Remove(Light); Light = null; } #endregion #region Particle Emitter if (typeof(TComponentType) == typeof(ParticleEmitter)) { if (particleEmitterAccessor == null) { throw new InvalidOperationException("Game Object 3D: Unable to remove the particle emitter component. There is not one."); } ParticleEmitter.Uninitialize(); Components.Remove(ParticleEmitter); ParticleEmitter.ComponentPool.Release(particleEmitterAccessor); ParticleEmitter = null; particleEmitterAccessor = null; } #endregion #region Particle Renderer if (typeof(TComponentType) == typeof(ParticleRenderer)) { if (particleRendererAccessor == null) { throw new InvalidOperationException("Game Object 3D: Unable to remove the particle renderer component. There is not one."); } ParticleRenderer.Uninitialize(); Components.Remove(ParticleRenderer); ParticleRenderer.ComponentPool.Release(particleRendererAccessor); ParticleRenderer = null; particleRendererAccessor = null; } #endregion #region Script if (typeof(Script).IsAssignableFrom(typeof(TComponentType))) { Component script = XNAFinalEngine.Components.Script.ContainScript <TComponentType>(this); if (script == null) { throw new ArgumentException("Game Object 3D: Unable to remove the script component. There is not one."); } script.Uninitialize(); Components.Remove(script); scripts.Remove((Script)script); } #endregion #region Sound Emitter if (typeof(TComponentType) == typeof(SoundEmitter)) { if (soundEmitterAccessor == null) { throw new InvalidOperationException("Game Object 3D: Unable to remove the sound emitter component. There is not one."); } SoundEmitter.Uninitialize(); Components.Remove(SoundEmitter); SoundEmitter.ComponentPool.Release(soundEmitterAccessor); SoundEmitter = null; soundEmitterAccessor = null; } #endregion #region Sound Listener if (typeof(TComponentType) == typeof(SoundListener)) { if (soundListenerAccessor == null) { throw new InvalidOperationException("Game Object 3D: Unable to remove the sound listener component. There is not one."); } SoundListener.Uninitialize(); Components.Remove(SoundListener); SoundListener.ComponentPool.Release(soundListenerAccessor); SoundListener = null; soundListenerAccessor = null; } #endregion #region HUD Text if (typeof(TComponentType) == typeof(HudText)) { if (hudTextAccessor == null) { throw new InvalidOperationException("Game Object 3D: Unable to remove the HUD text component. There is not one."); } HudText.Uninitialize(); Components.Remove(HudText); HudText.ComponentPool3D.Release(hudTextAccessor); HudText = null; hudTextAccessor = null; } #endregion #region HUD Texture if (typeof(TComponentType) == typeof(HudTexture)) { if (hudTextureAccessor == null) { throw new InvalidOperationException("Game Object 3D: Unable to remove the HUD texture component. There is not one."); } HudTexture.Uninitialize(); Components.Remove(HudTexture); HudTexture.ComponentPool3D.Release(hudTextureAccessor); HudTexture = null; hudTextureAccessor = null; } #endregion #region Line Renderer if (typeof(TComponentType) == typeof(LineRenderer)) { if (lineRendererAccessor == null) { throw new InvalidOperationException("Game Object 3D: Unable to remove the line renderer component. There is not one."); } LineRenderer.Uninitialize(); Components.Remove(LineRenderer); LineRenderer.ComponentPool3D.Release(lineRendererAccessor); LineRenderer = null; lineRendererAccessor = null; } #endregion #region Rigid Body if (typeof(TComponentType) == typeof(RigidBody)) { if (rigidBodyAccessor == null) { throw new InvalidOperationException("Game Object 3D: Unable to remove the rigid body component. There is not one."); } RigidBody.Uninitialize(); Components.Remove(RigidBody); RigidBody.ComponentPool.Release(rigidBodyAccessor); RigidBody = null; rigidBodyAccessor = null; } #endregion #region Static Collider if (typeof(TComponentType) == typeof(StaticCollider)) { if (staticColliderAccessor == null) { throw new InvalidOperationException("Game Object 3D: Unable to remove the static collider component. There is not one."); } StaticCollider.Uninitialize(); Components.Remove(StaticCollider); StaticCollider.ComponentPool.Release(staticColliderAccessor); StaticCollider = null; staticColliderAccessor = null; } #endregion } // RemoveComponent
} // DisposeManagedResources #endregion #region Add Component /// <summary> /// Adds a component of type TComponentType to the game object. /// </summary> /// <typeparam name="TComponentType">Component Type</typeparam> public override Component AddComponent <TComponentType>() { Component result = null; #region Transform // Get from a pool or create the component. if (typeof(TComponentType) == typeof(Transform3D)) { throw new ArgumentException("Game Object 3D: Unable to create the 3D transform component. The transform component can’t be replaced or removed."); } if (typeof(TComponentType) == typeof(Transform2D)) { throw new ArgumentException("Game Object 3D: Unable to create the 2D transform component. A 3D Game Object does not work in 2D."); } #endregion #region Model Filter if (typeof(TComponentType) == typeof(ModelFilter)) { if (modelFilterAccessor != null) { throw new ArgumentException("Game Object 3D: Unable to create the model filter component. There is one already."); } // Search for an empty component in the pool. modelFilterAccessor = ModelFilter.ComponentPool.Fetch(); // A component is a reference value, so no problem to do this. ModelFilter = ModelFilter.ComponentPool[modelFilterAccessor]; // Initialize the component to the default values. ModelFilter.Initialize(this); result = ModelFilter; } #endregion #region Model Renderer if (typeof(TComponentType) == typeof(ModelRenderer)) { if (modelRendererAccessor != null) { throw new ArgumentException("Game Object 3D: Unable to create the model renderer component. There is one already."); } // Search for an empty component in the pool. modelRendererAccessor = ModelRenderer.ComponentPool.Fetch(); // A component is a reference value, so no problem to do this. ModelRenderer = ModelRenderer.ComponentPool[modelRendererAccessor]; // Initialize the component to the default values. ModelRenderer.Initialize(this); result = ModelRenderer; } #endregion #region Root Animation if (typeof(TComponentType) == typeof(RootAnimations)) { if (rootAnimationAccessor != null) { throw new ArgumentException("Game Object 3D: Unable to create the root animation component. There is one already."); } // Search for an empty component in the pool. rootAnimationAccessor = RootAnimations.ComponentPool.Fetch(); // A component is a reference value, so no problem to do this. RootAnimations = RootAnimations.ComponentPool[rootAnimationAccessor]; // Initialize the component to the default values. RootAnimations.Initialize(this); result = RootAnimations; } #endregion #region Model Animation if (typeof(TComponentType) == typeof(ModelAnimations)) { if (modelAnimationAccessor != null) { throw new ArgumentException("Game Object 3D: Unable to create the model animation component. There is one already."); } // Search for an empty component in the pool. modelAnimationAccessor = ModelAnimations.ComponentPool.Fetch(); // A component is a reference value, so no problem to do this. ModelAnimations = ModelAnimations.ComponentPool[modelAnimationAccessor]; // Initialize the component to the default values. ModelAnimations.Initialize(this); result = ModelAnimations; } #endregion #region Camera if (typeof(TComponentType) == typeof(Camera)) { if (cameraAccessor != null) { throw new ArgumentException("Game Object 3D: Unable to create the camera component. There is one already."); } // Search for an empty component in the pool. cameraAccessor = Camera.ComponentPool.Fetch(); // A component is a reference value, so no problem to do this. Camera = Camera.ComponentPool[cameraAccessor]; // Initialize the component to the default values. Camera.Initialize(this); result = Camera; } #endregion #region Light if (typeof(Light).IsAssignableFrom(typeof(TComponentType))) { if (Light != null) { throw new ArgumentException("Game Object 3D: Unable to create the light component. There is one already."); } if (typeof(TComponentType) == typeof(DirectionalLight)) { // Search for an empty component in the pool. directionalLightAccessor = DirectionalLight.ComponentPool.Fetch(); // A component is a reference value, so no problem to do this. Light = DirectionalLight.ComponentPool[directionalLightAccessor]; DirectionalLight = DirectionalLight.ComponentPool[directionalLightAccessor]; } else if (typeof(TComponentType) == typeof(PointLight)) { // Search for an empty component in the pool. pointLightAccessor = PointLight.ComponentPool.Fetch(); // A component is a reference value, so no problem to do this. Light = PointLight.ComponentPool[pointLightAccessor]; PointLight = PointLight.ComponentPool[pointLightAccessor]; } else if (typeof(TComponentType) == typeof(SpotLight)) { // Search for an empty component in the pool. spotLightAccessor = SpotLight.ComponentPool.Fetch(); // A component is a reference value, so no problem to do this. Light = SpotLight.ComponentPool[spotLightAccessor]; SpotLight = SpotLight.ComponentPool[spotLightAccessor]; } else { throw new ArgumentException("Game Object 3D: Unable to create the light component."); } // Initialize the component to the default values. Light.Initialize(this); result = Light; } #endregion #region Particle Emitter if (typeof(ParticleEmitter).IsAssignableFrom(typeof(TComponentType))) { if (ParticleEmitter != null) { throw new ArgumentException("Game Object 3D: Unable to create the particle emitter component. There is one already."); } // Search for an empty component in the pool. particleEmitterAccessor = ParticleEmitter.ComponentPool.Fetch(); // A component is a reference value, so no problem to do this. ParticleEmitter = ParticleEmitter.ComponentPool[particleEmitterAccessor]; // Initialize the component to the default values. ParticleEmitter.Initialize(this); result = ParticleEmitter; } #endregion #region Particle Renderer if (typeof(TComponentType) == typeof(ParticleRenderer)) { if (particleRendererAccessor != null) { throw new ArgumentException("Game Object 3D: Unable to create the particle renderer component. There is one already."); } // Search for an empty component in the pool. particleRendererAccessor = ParticleRenderer.ComponentPool.Fetch(); // A component is a reference value, so no problem to do this. ParticleRenderer = ParticleRenderer.ComponentPool[particleRendererAccessor]; // Initialize the component to the default values. ParticleRenderer.Initialize(this); result = ParticleRenderer; } #endregion #region Script if (typeof(Script).IsAssignableFrom(typeof(TComponentType))) { Component script = XNAFinalEngine.Components.Script.ContainScript <TComponentType>(this); if (script != null) { throw new ArgumentException("Game Object 3D: Unable to create the script component. There is one already."); } script = XNAFinalEngine.Components.Script.FetchScript <TComponentType>(); if (script == null) { script = new TComponentType(); XNAFinalEngine.Components.Script.ScriptList.Add((Script)script); } script.Initialize(this); scripts.Add((Script)script); result = script; } #endregion #region Sound Emitter if (typeof(TComponentType) == typeof(SoundEmitter)) { if (soundEmitterAccessor != null) { throw new ArgumentException("Game Object 3D: Unable to create the sound emitter component. There is one already."); } // Search for an empty component in the pool. soundEmitterAccessor = SoundEmitter.ComponentPool.Fetch(); // A component is a reference value, so no problem to do this. SoundEmitter = SoundEmitter.ComponentPool[soundEmitterAccessor]; // Initialize the component to the default values. SoundEmitter.Initialize(this); result = SoundEmitter; } #endregion #region Sound Listener if (typeof(TComponentType) == typeof(SoundListener)) { if (soundListenerAccessor != null) { throw new ArgumentException("Game Object 3D: Unable to create the sound listener component. There is one already."); } // Search for an empty component in the pool. soundListenerAccessor = SoundListener.ComponentPool.Fetch(); // A component is a reference value, so no problem to do this. SoundListener = SoundListener.ComponentPool[soundListenerAccessor]; // Initialize the component to the default values. SoundListener.Initialize(this); result = SoundListener; } #endregion #region HUD Text if (typeof(TComponentType) == typeof(HudText)) { if (hudTextAccessor != null) { throw new ArgumentException("Game Object 3D: Unable to create the HUD text component. There is one already."); } // Search for an empty component in the pool. hudTextAccessor = HudText.ComponentPool3D.Fetch(); // A component is a reference value, so no problem to do this. HudText = HudText.ComponentPool3D[hudTextAccessor]; // Initialize the component to the default values. HudText.Initialize(this); result = HudText; } #endregion #region HUD Texture if (typeof(TComponentType) == typeof(HudTexture)) { if (hudTextureAccessor != null) { throw new ArgumentException("Game Object 3D: Unable to create the HUD texture component. There is one already."); } // Search for an empty component in the pool. hudTextureAccessor = HudTexture.ComponentPool3D.Fetch(); // A component is a reference value, so no problem to do this. HudTexture = HudTexture.ComponentPool3D[hudTextureAccessor]; // Initialize the component to the default values. HudTexture.Initialize(this); result = HudTexture; } #endregion #region Line Renderer if (typeof(TComponentType) == typeof(LineRenderer)) { if (lineRendererAccessor != null) { throw new ArgumentException("Game Object 3D: Unable to create the line renderer component. There is one already."); } // Search for an empty component in the pool. lineRendererAccessor = LineRenderer.ComponentPool3D.Fetch(); // A component is a reference value, so no problem to do this. LineRenderer = LineRenderer.ComponentPool3D[lineRendererAccessor]; // Initialize the component to the default values. lineRenderer.Initialize(this); result = lineRenderer; } #endregion #region Rigid Body if (typeof(TComponentType) == typeof(RigidBody)) { if (StaticCollider != null) { throw new ArgumentException("Game Object 3D: Unable to create the rigid body component. There is one static collider component already."); } if (rigidBodyAccessor != null) { throw new ArgumentException("Game Object 3D: Unable to create the rigid body component. There is one already."); } // Search for an empty component in the pool. rigidBodyAccessor = RigidBody.ComponentPool.Fetch(); // A component is a reference value, so no problem to do this. RigidBody = RigidBody.ComponentPool[rigidBodyAccessor]; // Initialize the component to the default values. rigidBody.Initialize(this); result = rigidBody; } #endregion #region Static Collider if (typeof(TComponentType) == typeof(StaticCollider)) { if (RigidBody != null) { throw new ArgumentException("Game Object 3D: Unable to create the static collider component. There is one rigid body component already."); } if (staticColliderAccessor != null) { throw new ArgumentException("Game Object 3D: Unable to create the static collider component. There is one already."); } // Search for an empty component in the pool. staticColliderAccessor = StaticCollider.ComponentPool.Fetch(); // A component is a reference value, so no problem to do this. StaticCollider = StaticCollider.ComponentPool[staticColliderAccessor]; // Initialize the component to the default values. staticCollider.Initialize(this); result = staticCollider; } #endregion if (result == null) { throw new ArgumentException("Game Object 3D: Unknown component type."); } Components.Add(result); return(result); } // AddComponent