* Added llApplyImpulse in the global frame. The object must be physical before this'll do anything. Be careful with this function as it's easy to loose prim.
							parent
							
								
									344b4d92f5
								
							
						
					
					
						commit
						18c959df12
					
				| 
						 | 
				
			
			@ -578,6 +578,16 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
            SetPartAsRoot(newPart);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void applyImpulse(PhysicsVector impulse)
 | 
			
		||||
        {
 | 
			
		||||
            SceneObjectPart rootpart = m_rootPart;
 | 
			
		||||
            if (m_rootPart.PhysActor != null)
 | 
			
		||||
            {
 | 
			
		||||
                m_rootPart.PhysActor.AddForce(impulse);
 | 
			
		||||
                m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void SetRootPartOwner(SceneObjectPart part, LLUUID cAgentID, LLUUID cGroupID)
 | 
			
		||||
        {
 | 
			
		||||
            part.LastOwnerID = part.OwnerID;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -520,6 +520,21 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
 | 
			
		||||
        protected PrimitiveBaseShape m_shape;
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// hook to the physics scene to apply impulse
 | 
			
		||||
        /// This is sent up to the group, which then finds the root prim
 | 
			
		||||
        /// and applies the force on the root prim of the group
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="impulse">Vector force</param>
 | 
			
		||||
        public void ApplyImpulse(LLVector3 impulsei)
 | 
			
		||||
        {
 | 
			
		||||
            PhysicsVector impulse = new PhysicsVector(impulsei.X, impulsei.Y, impulsei.Z);
 | 
			
		||||
            if (m_parentGroup != null)
 | 
			
		||||
            {
 | 
			
		||||
                m_parentGroup.applyImpulse(impulse);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void TriggerScriptChangedEvent(Changed val)
 | 
			
		||||
        {
 | 
			
		||||
            if (m_parentGroup != null)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,6 +27,7 @@
 | 
			
		|||
*/
 | 
			
		||||
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using Axiom.Math;
 | 
			
		||||
using Ode.NET;
 | 
			
		||||
using OpenSim.Framework;
 | 
			
		||||
| 
						 | 
				
			
			@ -51,6 +52,9 @@ namespace OpenSim.Region.Physics.OdePlugin
 | 
			
		|||
        private bool m_taintPhysics = false;
 | 
			
		||||
        public bool m_taintremove = false;
 | 
			
		||||
 | 
			
		||||
        private bool m_taintforce = false;
 | 
			
		||||
        private List<PhysicsVector> m_forcelist = new List<PhysicsVector>();
 | 
			
		||||
 | 
			
		||||
        private IMesh _mesh;
 | 
			
		||||
        private PrimitiveBaseShape _pbs;
 | 
			
		||||
        private OdeScene _parent_scene;
 | 
			
		||||
| 
						 | 
				
			
			@ -355,6 +359,9 @@ namespace OpenSim.Region.Physics.OdePlugin
 | 
			
		|||
            if (m_taintshape)
 | 
			
		||||
                changeshape(timestep);
 | 
			
		||||
            //
 | 
			
		||||
 | 
			
		||||
            if (m_taintforce)
 | 
			
		||||
                changeAddForce(timestep);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void Move(float timestep)
 | 
			
		||||
| 
						 | 
				
			
			@ -541,6 +548,27 @@ namespace OpenSim.Region.Physics.OdePlugin
 | 
			
		|||
            m_taintshape = false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void changeAddForce(float timestamp)
 | 
			
		||||
        {
 | 
			
		||||
            lock (m_forcelist)
 | 
			
		||||
            {
 | 
			
		||||
                //OpenSim.Framework.Console.MainLog.Instance.Verbose("PHYSICS", "dequeing forcelist");
 | 
			
		||||
                if (IsPhysical)
 | 
			
		||||
                {
 | 
			
		||||
                    PhysicsVector iforce = new PhysicsVector();
 | 
			
		||||
                    for (int i = 0; i < m_forcelist.Count; i++)
 | 
			
		||||
                    {
 | 
			
		||||
                        iforce = iforce + (m_forcelist[i]*100);
 | 
			
		||||
                    }   
 | 
			
		||||
                    d.BodyEnable(Body);
 | 
			
		||||
                    d.BodyAddForce(Body, iforce.X, iforce.Y, iforce.Z);
 | 
			
		||||
                }
 | 
			
		||||
                m_forcelist.Clear();
 | 
			
		||||
            }
 | 
			
		||||
            m_taintforce = false;
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override bool IsPhysical
 | 
			
		||||
        {
 | 
			
		||||
            get { return m_isphysical; }
 | 
			
		||||
| 
						 | 
				
			
			@ -663,6 +691,9 @@ namespace OpenSim.Region.Physics.OdePlugin
 | 
			
		|||
 | 
			
		||||
        public override void AddForce(PhysicsVector force)
 | 
			
		||||
        {
 | 
			
		||||
            m_forcelist.Add(force);
 | 
			
		||||
            m_taintforce = true;
 | 
			
		||||
            //OpenSim.Framework.Console.MainLog.Instance.Verbose("PHYSICS", "Added Force:" + force.ToString() +  " to prim at " + Position.ToString());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override PhysicsVector RotationalVelocity
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -792,7 +792,22 @@ namespace OpenSim.Region.ScriptEngine.Common
 | 
			
		|||
 | 
			
		||||
        public void llApplyImpulse(LSL_Types.Vector3 force, int local)
 | 
			
		||||
        {
 | 
			
		||||
            NotImplemented("llApplyImpulse");
 | 
			
		||||
            //No energy force yet
 | 
			
		||||
            if (local == 1)
 | 
			
		||||
            {
 | 
			
		||||
                NotImplemented("llApplyImpulse Local Force");
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                if (force.x > 20000)
 | 
			
		||||
                    force.x = 20000;
 | 
			
		||||
                if (force.y > 20000)
 | 
			
		||||
                    force.y = 20000;
 | 
			
		||||
                if (force.z > 20000)
 | 
			
		||||
                    force.z = 20000;
 | 
			
		||||
 | 
			
		||||
                m_host.ApplyImpulse(new LLVector3((float)force.x,(float)force.y,(float)force.z));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void llApplyRotationalImpulse(LSL_Types.Vector3 force, int local)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue