mirror of
https://github.com/opensim/opensim.git
synced 2026-08-04 16:22:50 +08:00
Merge branch 'ubitwork'
Conflicts: OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs OpenSim/Region/Physics/ChOdePlugin/OdePlugin.cs
This commit is contained in:
487
OpenSim/Region/Framework/Scenes/SOPVehicle.cs
Normal file
487
OpenSim/Region/Framework/Scenes/SOPVehicle.cs
Normal file
@@ -0,0 +1,487 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Physics.Manager;
|
||||
using System.Xml;
|
||||
using OpenSim.Framework.Serialization;
|
||||
using OpenSim.Framework.Serialization.External;
|
||||
using OpenSim.Region.Framework.Scenes.Serialization;
|
||||
|
||||
namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
public class SOPVehicle
|
||||
{
|
||||
public VehicleData vd;
|
||||
|
||||
public Vehicle Type
|
||||
{
|
||||
get { return vd.m_type; }
|
||||
}
|
||||
|
||||
public SOPVehicle()
|
||||
{
|
||||
vd = new VehicleData();
|
||||
ProcessTypeChange(Vehicle.TYPE_NONE); // is needed?
|
||||
}
|
||||
|
||||
public void ProcessFloatVehicleParam(Vehicle pParam, float pValue)
|
||||
{
|
||||
float len;
|
||||
float timestep = 0.01f;
|
||||
switch (pParam)
|
||||
{
|
||||
case Vehicle.ANGULAR_DEFLECTION_EFFICIENCY:
|
||||
if (pValue < 0f) pValue = 0f;
|
||||
if (pValue > 1f) pValue = 1f;
|
||||
vd.m_angularDeflectionEfficiency = pValue;
|
||||
break;
|
||||
case Vehicle.ANGULAR_DEFLECTION_TIMESCALE:
|
||||
if (pValue < timestep) pValue = timestep;
|
||||
vd.m_angularDeflectionTimescale = pValue;
|
||||
break;
|
||||
case Vehicle.ANGULAR_MOTOR_DECAY_TIMESCALE:
|
||||
if (pValue < timestep) pValue = timestep;
|
||||
else if (pValue > 120) pValue = 120;
|
||||
vd.m_angularMotorDecayTimescale = pValue;
|
||||
break;
|
||||
case Vehicle.ANGULAR_MOTOR_TIMESCALE:
|
||||
if (pValue < timestep) pValue = timestep;
|
||||
vd.m_angularMotorTimescale = pValue;
|
||||
break;
|
||||
case Vehicle.BANKING_EFFICIENCY:
|
||||
if (pValue < -1f) pValue = -1f;
|
||||
if (pValue > 1f) pValue = 1f;
|
||||
vd.m_bankingEfficiency = pValue;
|
||||
break;
|
||||
case Vehicle.BANKING_MIX:
|
||||
if (pValue < 0f) pValue = 0f;
|
||||
if (pValue > 1f) pValue = 1f;
|
||||
vd.m_bankingMix = pValue;
|
||||
break;
|
||||
case Vehicle.BANKING_TIMESCALE:
|
||||
if (pValue < timestep) pValue = timestep;
|
||||
vd.m_bankingTimescale = pValue;
|
||||
break;
|
||||
case Vehicle.BUOYANCY:
|
||||
if (pValue < -1f) pValue = -1f;
|
||||
if (pValue > 1f) pValue = 1f;
|
||||
vd.m_VehicleBuoyancy = pValue;
|
||||
break;
|
||||
case Vehicle.HOVER_EFFICIENCY:
|
||||
if (pValue < 0f) pValue = 0f;
|
||||
if (pValue > 1f) pValue = 1f;
|
||||
vd.m_VhoverEfficiency = pValue;
|
||||
break;
|
||||
case Vehicle.HOVER_HEIGHT:
|
||||
vd.m_VhoverHeight = pValue;
|
||||
break;
|
||||
case Vehicle.HOVER_TIMESCALE:
|
||||
if (pValue < timestep) pValue = timestep;
|
||||
vd.m_VhoverTimescale = pValue;
|
||||
break;
|
||||
case Vehicle.LINEAR_DEFLECTION_EFFICIENCY:
|
||||
if (pValue < 0f) pValue = 0f;
|
||||
if (pValue > 1f) pValue = 1f;
|
||||
vd.m_linearDeflectionEfficiency = pValue;
|
||||
break;
|
||||
case Vehicle.LINEAR_DEFLECTION_TIMESCALE:
|
||||
if (pValue < timestep) pValue = timestep;
|
||||
vd.m_linearDeflectionTimescale = pValue;
|
||||
break;
|
||||
case Vehicle.LINEAR_MOTOR_DECAY_TIMESCALE:
|
||||
// if (pValue < timestep) pValue = timestep;
|
||||
// try to make impulses to work a bit better
|
||||
if (pValue < timestep) pValue = timestep;
|
||||
else if (pValue > 120) pValue = 120;
|
||||
vd.m_linearMotorDecayTimescale = pValue;
|
||||
break;
|
||||
case Vehicle.LINEAR_MOTOR_TIMESCALE:
|
||||
if (pValue < timestep) pValue = timestep;
|
||||
vd.m_linearMotorTimescale = pValue;
|
||||
break;
|
||||
case Vehicle.VERTICAL_ATTRACTION_EFFICIENCY:
|
||||
if (pValue < 0f) pValue = 0f;
|
||||
if (pValue > 1f) pValue = 1f;
|
||||
vd.m_verticalAttractionEfficiency = pValue;
|
||||
break;
|
||||
case Vehicle.VERTICAL_ATTRACTION_TIMESCALE:
|
||||
if (pValue < timestep) pValue = timestep;
|
||||
vd.m_verticalAttractionTimescale = pValue;
|
||||
break;
|
||||
|
||||
// These are vector properties but the engine lets you use a single float value to
|
||||
// set all of the components to the same value
|
||||
case Vehicle.ANGULAR_FRICTION_TIMESCALE:
|
||||
if (pValue < timestep) pValue = timestep;
|
||||
vd.m_angularFrictionTimescale = new Vector3(pValue, pValue, pValue);
|
||||
break;
|
||||
case Vehicle.ANGULAR_MOTOR_DIRECTION:
|
||||
vd.m_angularMotorDirection = new Vector3(pValue, pValue, pValue);
|
||||
len = vd.m_angularMotorDirection.Length();
|
||||
if (len > 12.566f)
|
||||
vd.m_angularMotorDirection *= (12.566f / len);
|
||||
break;
|
||||
case Vehicle.LINEAR_FRICTION_TIMESCALE:
|
||||
if (pValue < timestep) pValue = timestep;
|
||||
vd.m_linearFrictionTimescale = new Vector3(pValue, pValue, pValue);
|
||||
break;
|
||||
case Vehicle.LINEAR_MOTOR_DIRECTION:
|
||||
vd.m_linearMotorDirection = new Vector3(pValue, pValue, pValue);
|
||||
len = vd.m_linearMotorDirection.Length();
|
||||
if (len > 30.0f)
|
||||
vd.m_linearMotorDirection *= (30.0f / len);
|
||||
break;
|
||||
case Vehicle.LINEAR_MOTOR_OFFSET:
|
||||
vd.m_linearMotorOffset = new Vector3(pValue, pValue, pValue);
|
||||
len = vd.m_linearMotorOffset.Length();
|
||||
if (len > 100.0f)
|
||||
vd.m_linearMotorOffset *= (100.0f / len);
|
||||
break;
|
||||
}
|
||||
}//end ProcessFloatVehicleParam
|
||||
|
||||
public void ProcessVectorVehicleParam(Vehicle pParam, Vector3 pValue)
|
||||
{
|
||||
float len;
|
||||
float timestep = 0.01f;
|
||||
switch (pParam)
|
||||
{
|
||||
case Vehicle.ANGULAR_FRICTION_TIMESCALE:
|
||||
if (pValue.X < timestep) pValue.X = timestep;
|
||||
if (pValue.Y < timestep) pValue.Y = timestep;
|
||||
if (pValue.Z < timestep) pValue.Z = timestep;
|
||||
|
||||
vd.m_angularFrictionTimescale = new Vector3(pValue.X, pValue.Y, pValue.Z);
|
||||
break;
|
||||
case Vehicle.ANGULAR_MOTOR_DIRECTION:
|
||||
vd.m_angularMotorDirection = new Vector3(pValue.X, pValue.Y, pValue.Z);
|
||||
// Limit requested angular speed to 2 rps= 4 pi rads/sec
|
||||
len = vd.m_angularMotorDirection.Length();
|
||||
if (len > 12.566f)
|
||||
vd.m_angularMotorDirection *= (12.566f / len);
|
||||
break;
|
||||
case Vehicle.LINEAR_FRICTION_TIMESCALE:
|
||||
if (pValue.X < timestep) pValue.X = timestep;
|
||||
if (pValue.Y < timestep) pValue.Y = timestep;
|
||||
if (pValue.Z < timestep) pValue.Z = timestep;
|
||||
vd.m_linearFrictionTimescale = new Vector3(pValue.X, pValue.Y, pValue.Z);
|
||||
break;
|
||||
case Vehicle.LINEAR_MOTOR_DIRECTION:
|
||||
vd.m_linearMotorDirection = new Vector3(pValue.X, pValue.Y, pValue.Z);
|
||||
len = vd.m_linearMotorDirection.Length();
|
||||
if (len > 30.0f)
|
||||
vd.m_linearMotorDirection *= (30.0f / len);
|
||||
break;
|
||||
case Vehicle.LINEAR_MOTOR_OFFSET:
|
||||
vd.m_linearMotorOffset = new Vector3(pValue.X, pValue.Y, pValue.Z);
|
||||
len = vd.m_linearMotorOffset.Length();
|
||||
if (len > 100.0f)
|
||||
vd.m_linearMotorOffset *= (100.0f / len);
|
||||
break;
|
||||
}
|
||||
}//end ProcessVectorVehicleParam
|
||||
|
||||
public void ProcessRotationVehicleParam(Vehicle pParam, Quaternion pValue)
|
||||
{
|
||||
switch (pParam)
|
||||
{
|
||||
case Vehicle.REFERENCE_FRAME:
|
||||
vd.m_referenceFrame = Quaternion.Inverse(pValue);
|
||||
break;
|
||||
}
|
||||
}//end ProcessRotationVehicleParam
|
||||
|
||||
public void ProcessVehicleFlags(int pParam, bool remove)
|
||||
{
|
||||
if (remove)
|
||||
{
|
||||
vd.m_flags &= ~((VehicleFlag)pParam);
|
||||
}
|
||||
else
|
||||
{
|
||||
vd.m_flags |= (VehicleFlag)pParam;
|
||||
}
|
||||
}//end ProcessVehicleFlags
|
||||
|
||||
public void ProcessTypeChange(Vehicle pType)
|
||||
{
|
||||
vd.m_linearMotorDirection = Vector3.Zero;
|
||||
vd.m_angularMotorDirection = Vector3.Zero;
|
||||
vd.m_linearMotorOffset = Vector3.Zero;
|
||||
vd.m_referenceFrame = Quaternion.Identity;
|
||||
|
||||
// Set Defaults For Type
|
||||
vd.m_type = pType;
|
||||
switch (pType)
|
||||
{
|
||||
case Vehicle.TYPE_NONE:
|
||||
vd.m_linearFrictionTimescale = new Vector3(1000, 1000, 1000);
|
||||
vd.m_angularFrictionTimescale = new Vector3(1000, 1000, 1000);
|
||||
vd.m_linearMotorTimescale = 1000;
|
||||
vd.m_linearMotorDecayTimescale = 120;
|
||||
vd.m_angularMotorTimescale = 1000;
|
||||
vd.m_angularMotorDecayTimescale = 1000;
|
||||
vd.m_VhoverHeight = 0;
|
||||
vd.m_VhoverEfficiency = 1;
|
||||
vd.m_VhoverTimescale = 1000;
|
||||
vd.m_VehicleBuoyancy = 0;
|
||||
vd.m_linearDeflectionEfficiency = 0;
|
||||
vd.m_linearDeflectionTimescale = 1000;
|
||||
vd.m_angularDeflectionEfficiency = 0;
|
||||
vd.m_angularDeflectionTimescale = 1000;
|
||||
vd.m_bankingEfficiency = 0;
|
||||
vd.m_bankingMix = 1;
|
||||
vd.m_bankingTimescale = 1000;
|
||||
vd.m_verticalAttractionEfficiency = 0;
|
||||
vd.m_verticalAttractionTimescale = 1000;
|
||||
|
||||
vd.m_flags = (VehicleFlag)0;
|
||||
break;
|
||||
|
||||
case Vehicle.TYPE_SLED:
|
||||
vd.m_linearFrictionTimescale = new Vector3(30, 1, 1000);
|
||||
vd.m_angularFrictionTimescale = new Vector3(1000, 1000, 1000);
|
||||
vd.m_linearMotorTimescale = 1000;
|
||||
vd.m_linearMotorDecayTimescale = 120;
|
||||
vd.m_angularMotorTimescale = 1000;
|
||||
vd.m_angularMotorDecayTimescale = 120;
|
||||
vd.m_VhoverHeight = 0;
|
||||
vd.m_VhoverEfficiency = 1;
|
||||
vd.m_VhoverTimescale = 10;
|
||||
vd.m_VehicleBuoyancy = 0;
|
||||
vd.m_linearDeflectionEfficiency = 1;
|
||||
vd.m_linearDeflectionTimescale = 1;
|
||||
vd.m_angularDeflectionEfficiency = 0;
|
||||
vd.m_angularDeflectionTimescale = 1000;
|
||||
vd.m_bankingEfficiency = 0;
|
||||
vd.m_bankingMix = 1;
|
||||
vd.m_bankingTimescale = 10;
|
||||
vd.m_flags &=
|
||||
~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY |
|
||||
VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY);
|
||||
vd.m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_ROLL_ONLY | VehicleFlag.LIMIT_MOTOR_UP);
|
||||
break;
|
||||
case Vehicle.TYPE_CAR:
|
||||
vd.m_linearFrictionTimescale = new Vector3(100, 2, 1000);
|
||||
vd.m_angularFrictionTimescale = new Vector3(1000, 1000, 1000);
|
||||
vd.m_linearMotorTimescale = 1;
|
||||
vd.m_linearMotorDecayTimescale = 60;
|
||||
vd.m_angularMotorTimescale = 1;
|
||||
vd.m_angularMotorDecayTimescale = 0.8f;
|
||||
vd.m_VhoverHeight = 0;
|
||||
vd.m_VhoverEfficiency = 0;
|
||||
vd.m_VhoverTimescale = 1000;
|
||||
vd.m_VehicleBuoyancy = 0;
|
||||
vd.m_linearDeflectionEfficiency = 1;
|
||||
vd.m_linearDeflectionTimescale = 2;
|
||||
vd.m_angularDeflectionEfficiency = 0;
|
||||
vd.m_angularDeflectionTimescale = 10;
|
||||
vd.m_verticalAttractionEfficiency = 1f;
|
||||
vd.m_verticalAttractionTimescale = 10f;
|
||||
vd.m_bankingEfficiency = -0.2f;
|
||||
vd.m_bankingMix = 1;
|
||||
vd.m_bankingTimescale = 1;
|
||||
vd.m_flags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT);
|
||||
vd.m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_ROLL_ONLY |
|
||||
VehicleFlag.LIMIT_MOTOR_UP | VehicleFlag.HOVER_UP_ONLY);
|
||||
break;
|
||||
case Vehicle.TYPE_BOAT:
|
||||
vd.m_linearFrictionTimescale = new Vector3(10, 3, 2);
|
||||
vd.m_angularFrictionTimescale = new Vector3(10, 10, 10);
|
||||
vd.m_linearMotorTimescale = 5;
|
||||
vd.m_linearMotorDecayTimescale = 60;
|
||||
vd.m_angularMotorTimescale = 4;
|
||||
vd.m_angularMotorDecayTimescale = 4;
|
||||
vd.m_VhoverHeight = 0;
|
||||
vd.m_VhoverEfficiency = 0.5f;
|
||||
vd.m_VhoverTimescale = 2;
|
||||
vd.m_VehicleBuoyancy = 1;
|
||||
vd.m_linearDeflectionEfficiency = 0.5f;
|
||||
vd.m_linearDeflectionTimescale = 3;
|
||||
vd.m_angularDeflectionEfficiency = 0.5f;
|
||||
vd.m_angularDeflectionTimescale = 5;
|
||||
vd.m_verticalAttractionEfficiency = 0.5f;
|
||||
vd.m_verticalAttractionTimescale = 5f;
|
||||
vd.m_bankingEfficiency = -0.3f;
|
||||
vd.m_bankingMix = 0.8f;
|
||||
vd.m_bankingTimescale = 1;
|
||||
vd.m_flags &= ~(VehicleFlag.HOVER_TERRAIN_ONLY |
|
||||
VehicleFlag.HOVER_GLOBAL_HEIGHT |
|
||||
VehicleFlag.HOVER_UP_ONLY |
|
||||
VehicleFlag.LIMIT_ROLL_ONLY);
|
||||
vd.m_flags |= (VehicleFlag.NO_DEFLECTION_UP |
|
||||
VehicleFlag.LIMIT_MOTOR_UP |
|
||||
VehicleFlag.HOVER_WATER_ONLY);
|
||||
break;
|
||||
case Vehicle.TYPE_AIRPLANE:
|
||||
vd.m_linearFrictionTimescale = new Vector3(200, 10, 5);
|
||||
vd.m_angularFrictionTimescale = new Vector3(20, 20, 20);
|
||||
vd.m_linearMotorTimescale = 2;
|
||||
vd.m_linearMotorDecayTimescale = 60;
|
||||
vd.m_angularMotorTimescale = 4;
|
||||
vd.m_angularMotorDecayTimescale = 8;
|
||||
vd.m_VhoverHeight = 0;
|
||||
vd.m_VhoverEfficiency = 0.5f;
|
||||
vd.m_VhoverTimescale = 1000;
|
||||
vd.m_VehicleBuoyancy = 0;
|
||||
vd.m_linearDeflectionEfficiency = 0.5f;
|
||||
vd.m_linearDeflectionTimescale = 0.5f;
|
||||
vd.m_angularDeflectionEfficiency = 1;
|
||||
vd.m_angularDeflectionTimescale = 2;
|
||||
vd.m_verticalAttractionEfficiency = 0.9f;
|
||||
vd.m_verticalAttractionTimescale = 2f;
|
||||
vd.m_bankingEfficiency = 1;
|
||||
vd.m_bankingMix = 0.7f;
|
||||
vd.m_bankingTimescale = 2;
|
||||
vd.m_flags &= ~(VehicleFlag.HOVER_WATER_ONLY |
|
||||
VehicleFlag.HOVER_TERRAIN_ONLY |
|
||||
VehicleFlag.HOVER_GLOBAL_HEIGHT |
|
||||
VehicleFlag.HOVER_UP_ONLY |
|
||||
VehicleFlag.NO_DEFLECTION_UP |
|
||||
VehicleFlag.LIMIT_MOTOR_UP);
|
||||
vd.m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY);
|
||||
break;
|
||||
case Vehicle.TYPE_BALLOON:
|
||||
vd.m_linearFrictionTimescale = new Vector3(5, 5, 5);
|
||||
vd.m_angularFrictionTimescale = new Vector3(10, 10, 10);
|
||||
vd.m_linearMotorTimescale = 5;
|
||||
vd.m_linearMotorDecayTimescale = 60;
|
||||
vd.m_angularMotorTimescale = 6;
|
||||
vd.m_angularMotorDecayTimescale = 10;
|
||||
vd.m_VhoverHeight = 5;
|
||||
vd.m_VhoverEfficiency = 0.8f;
|
||||
vd.m_VhoverTimescale = 10;
|
||||
vd.m_VehicleBuoyancy = 1;
|
||||
vd.m_linearDeflectionEfficiency = 0;
|
||||
vd.m_linearDeflectionTimescale = 5;
|
||||
vd.m_angularDeflectionEfficiency = 0;
|
||||
vd.m_angularDeflectionTimescale = 5;
|
||||
vd.m_verticalAttractionEfficiency = 0f;
|
||||
vd.m_verticalAttractionTimescale = 1000f;
|
||||
vd.m_bankingEfficiency = 0;
|
||||
vd.m_bankingMix = 0.7f;
|
||||
vd.m_bankingTimescale = 5;
|
||||
vd.m_flags &= ~(VehicleFlag.HOVER_WATER_ONLY |
|
||||
VehicleFlag.HOVER_TERRAIN_ONLY |
|
||||
VehicleFlag.HOVER_UP_ONLY |
|
||||
VehicleFlag.NO_DEFLECTION_UP |
|
||||
VehicleFlag.LIMIT_MOTOR_UP);
|
||||
vd.m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY |
|
||||
VehicleFlag.HOVER_GLOBAL_HEIGHT);
|
||||
break;
|
||||
}
|
||||
}
|
||||
public void SetVehicle(PhysicsActor ph)
|
||||
{
|
||||
if (ph == null)
|
||||
return;
|
||||
ph.SetVehicle(vd);
|
||||
}
|
||||
|
||||
private XmlTextWriter writer;
|
||||
|
||||
private void XWint(string name, int i)
|
||||
{
|
||||
writer.WriteElementString(name, i.ToString());
|
||||
}
|
||||
|
||||
private void XWfloat(string name, float f)
|
||||
{
|
||||
writer.WriteElementString(name, f.ToString(Utils.EnUsCulture));
|
||||
}
|
||||
|
||||
private void XWVector(string name, Vector3 vec)
|
||||
{
|
||||
writer.WriteStartElement(name);
|
||||
writer.WriteElementString("X", vec.X.ToString(Utils.EnUsCulture));
|
||||
writer.WriteElementString("Y", vec.Y.ToString(Utils.EnUsCulture));
|
||||
writer.WriteElementString("Z", vec.Z.ToString(Utils.EnUsCulture));
|
||||
writer.WriteEndElement();
|
||||
}
|
||||
|
||||
private void XWQuat(string name, Quaternion quat)
|
||||
{
|
||||
writer.WriteStartElement(name);
|
||||
writer.WriteElementString("X", quat.X.ToString(Utils.EnUsCulture));
|
||||
writer.WriteElementString("Y", quat.Y.ToString(Utils.EnUsCulture));
|
||||
writer.WriteElementString("Z", quat.Z.ToString(Utils.EnUsCulture));
|
||||
writer.WriteElementString("W", quat.W.ToString(Utils.EnUsCulture));
|
||||
writer.WriteEndElement();
|
||||
}
|
||||
|
||||
public void ToXml2(XmlTextWriter twriter)
|
||||
{
|
||||
writer = twriter;
|
||||
writer.WriteStartElement("SOGVehicle");
|
||||
|
||||
XWint("TYPE", (int)vd.m_type);
|
||||
XWint("FLAGS", (int)vd.m_flags);
|
||||
|
||||
// Linear properties
|
||||
XWVector("LMDIR", vd.m_linearMotorDirection);
|
||||
XWVector("LMFTIME", vd.m_linearFrictionTimescale);
|
||||
XWfloat("LMDTIME", vd.m_linearMotorDecayTimescale);
|
||||
XWfloat("LMTIME", vd.m_linearMotorTimescale);
|
||||
XWVector("LMOFF", vd.m_linearMotorOffset);
|
||||
|
||||
//Angular properties
|
||||
XWVector("AMDIR", vd.m_angularMotorDirection);
|
||||
XWfloat("AMTIME", vd.m_angularMotorTimescale);
|
||||
XWfloat("AMDTIME", vd.m_angularMotorDecayTimescale);
|
||||
XWVector("AMFTIME", vd.m_angularFrictionTimescale);
|
||||
|
||||
//Deflection properties
|
||||
XWfloat("ADEFF", vd.m_angularDeflectionEfficiency);
|
||||
XWfloat("ADTIME", vd.m_angularDeflectionTimescale);
|
||||
XWfloat("LDEFF", vd.m_linearDeflectionEfficiency);
|
||||
XWfloat("LDTIME", vd.m_linearDeflectionTimescale);
|
||||
|
||||
//Banking properties
|
||||
XWfloat("BEFF", vd.m_bankingEfficiency);
|
||||
XWfloat("BMIX", vd.m_bankingMix);
|
||||
XWfloat("BTIME", vd.m_bankingTimescale);
|
||||
|
||||
//Hover and Buoyancy properties
|
||||
XWfloat("HHEI", vd.m_VhoverHeight);
|
||||
XWfloat("HEFF", vd.m_VhoverEfficiency);
|
||||
XWfloat("HTIME", vd.m_VhoverTimescale);
|
||||
XWfloat("VBUO", vd.m_VehicleBuoyancy);
|
||||
|
||||
//Attractor properties
|
||||
XWfloat("VAEFF", vd.m_verticalAttractionEfficiency);
|
||||
XWfloat("VATIME", vd.m_verticalAttractionTimescale);
|
||||
|
||||
XWQuat("REF_FRAME", vd.m_referenceFrame);
|
||||
|
||||
writer.WriteEndElement();
|
||||
writer = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4792,7 +4792,7 @@ Environment.Exit(1);
|
||||
bool wasUsingPhysics = ((jointProxyObject.Flags & PrimFlags.Physics) != 0);
|
||||
if (wasUsingPhysics)
|
||||
{
|
||||
jointProxyObject.UpdatePrimFlags(false, false, true, false); // FIXME: possible deadlock here; check to make sure all the scene alterations set into motion here won't deadlock
|
||||
jointProxyObject.UpdatePrimFlags(false, false, true, false,false); // FIXME: possible deadlock here; check to make sure all the scene alterations set into motion here won't deadlock
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@ using OpenSim.Region.Framework.Scenes.Serialization;
|
||||
|
||||
namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
|
||||
[Flags]
|
||||
public enum scriptEvents
|
||||
{
|
||||
@@ -1378,7 +1379,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
m_rootPart.SetParentLocalId(0);
|
||||
AttachmentPoint = (byte)0;
|
||||
m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive);
|
||||
// must check if buildind should be true or false here
|
||||
m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive,false);
|
||||
HasGroupChanged = true;
|
||||
RootPart.Rezzed = DateTime.Now;
|
||||
RootPart.RemFlag(PrimFlags.TemporaryOnRez);
|
||||
@@ -1677,22 +1679,32 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
/// </summary>
|
||||
public void ApplyPhysics()
|
||||
{
|
||||
// Apply physics to the root prim
|
||||
m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive);
|
||||
|
||||
// Apply physics to child prims
|
||||
SceneObjectPart[] parts = m_parts.GetArray();
|
||||
if (parts.Length > 1)
|
||||
{
|
||||
ResetChildPrimPhysicsPositions();
|
||||
|
||||
// Apply physics to the root prim
|
||||
m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive, true);
|
||||
|
||||
|
||||
for (int i = 0; i < parts.Length; i++)
|
||||
{
|
||||
SceneObjectPart part = parts[i];
|
||||
if (part.LocalId != m_rootPart.LocalId)
|
||||
part.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), part.VolumeDetectActive);
|
||||
part.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), part.VolumeDetectActive, true);
|
||||
}
|
||||
|
||||
// Hack to get the physics scene geometries in the right spot
|
||||
ResetChildPrimPhysicsPositions();
|
||||
// ResetChildPrimPhysicsPositions();
|
||||
if (m_rootPart.PhysActor != null)
|
||||
{
|
||||
m_rootPart.PhysActor.Building = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Apply physics to the root prim
|
||||
m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1863,6 +1875,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
/// <returns></returns>
|
||||
public SceneObjectGroup Copy(bool userExposed)
|
||||
{
|
||||
m_dupeInProgress = true;
|
||||
SceneObjectGroup dupe = (SceneObjectGroup)MemberwiseClone();
|
||||
dupe.m_isBackedUp = false;
|
||||
dupe.m_parts = new MapAndArray<OpenMetaverse.UUID, SceneObjectPart>();
|
||||
@@ -1926,13 +1939,16 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
pbs,
|
||||
newPart.AbsolutePosition,
|
||||
newPart.Scale,
|
||||
newPart.RotationOffset,
|
||||
//newPart.RotationOffset,
|
||||
newPart.GetWorldRotation(),
|
||||
part.PhysActor.IsPhysical,
|
||||
newPart.LocalId);
|
||||
|
||||
newPart.DoPhysicsPropertyUpdate(part.PhysActor.IsPhysical, true);
|
||||
}
|
||||
}
|
||||
if (dupe.m_rootPart.PhysActor != null && userExposed)
|
||||
dupe.m_rootPart.PhysActor.Building = false; // tell physics to finish building
|
||||
|
||||
if (userExposed)
|
||||
{
|
||||
@@ -1943,6 +1959,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
ScheduleGroupForFullUpdate();
|
||||
}
|
||||
|
||||
m_dupeInProgress = false;
|
||||
return dupe;
|
||||
}
|
||||
|
||||
@@ -2950,12 +2967,31 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
RootPart.UpdatePrimFlags(UsePhysics, SetTemporary, SetPhantom, SetVolumeDetect);
|
||||
for (int i = 0; i < parts.Length; i++)
|
||||
{
|
||||
if (parts[i] != RootPart)
|
||||
parts[i].UpdatePrimFlags(UsePhysics, SetTemporary, SetPhantom, SetVolumeDetect);
|
||||
}
|
||||
*/
|
||||
if (parts.Length > 1)
|
||||
{
|
||||
m_rootPart.UpdatePrimFlags(UsePhysics, SetTemporary, SetPhantom, SetVolumeDetect, true);
|
||||
|
||||
for (int i = 0; i < parts.Length; i++)
|
||||
{
|
||||
|
||||
if (parts[i].UUID != m_rootPart.UUID)
|
||||
parts[i].UpdatePrimFlags(UsePhysics, SetTemporary, SetPhantom, SetVolumeDetect, true);
|
||||
}
|
||||
|
||||
if (m_rootPart.PhysActor != null)
|
||||
m_rootPart.PhysActor.Building = false;
|
||||
}
|
||||
else
|
||||
m_rootPart.UpdatePrimFlags(UsePhysics, SetTemporary, SetPhantom, SetVolumeDetect, false);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -310,6 +310,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
private UUID m_collisionSound;
|
||||
private float m_collisionSoundVolume;
|
||||
|
||||
|
||||
private SOPVehicle m_vehicle = null;
|
||||
|
||||
#endregion Fields
|
||||
|
||||
// ~SceneObjectPart()
|
||||
@@ -1506,7 +1509,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
/// </summary>
|
||||
/// <param name="rootObjectFlags"></param>
|
||||
/// <param name="VolumeDetectActive"></param>
|
||||
public void ApplyPhysics(uint rootObjectFlags, bool VolumeDetectActive)
|
||||
// public void ApplyPhysics(uint rootObjectFlags, bool VolumeDetectActive)
|
||||
public void ApplyPhysics(uint rootObjectFlags, bool VolumeDetectActive, bool building)
|
||||
{
|
||||
if (!ParentGroup.Scene.CollidablePrims)
|
||||
return;
|
||||
@@ -1542,7 +1546,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
Shape,
|
||||
AbsolutePosition,
|
||||
Scale,
|
||||
RotationOffset,
|
||||
// RotationOffset,
|
||||
GetWorldRotation(), // physics wants world rotation
|
||||
RigidBody,
|
||||
m_localId);
|
||||
}
|
||||
@@ -1557,8 +1562,16 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
PhysActor.SOPName = this.Name; // save object into the PhysActor so ODE internals know the joint/body info
|
||||
PhysActor.SetMaterial(Material);
|
||||
|
||||
// if root part apply vehicle
|
||||
if (m_vehicle != null && LocalId == ParentGroup.RootPart.LocalId)
|
||||
m_vehicle.SetVehicle(PhysActor);
|
||||
|
||||
DoPhysicsPropertyUpdate(RigidBody, true);
|
||||
PhysActor.SetVolumeDetect(VolumeDetectActive ? 1 : 0);
|
||||
|
||||
if (!building)
|
||||
PhysActor.Building = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1794,6 +1807,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
if (!isNew)
|
||||
ParentGroup.Scene.RemovePhysicalPrim(1);
|
||||
|
||||
Velocity = new Vector3(0, 0, 0);
|
||||
Acceleration = new Vector3(0, 0, 0);
|
||||
AngularVelocity = new Vector3(0, 0, 0);
|
||||
|
||||
PhysActor.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate;
|
||||
PhysActor.OnOutOfBounds -= PhysicsOutOfBounds;
|
||||
PhysActor.delink();
|
||||
@@ -3163,17 +3180,61 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public int VehicleType
|
||||
{
|
||||
get
|
||||
{
|
||||
if (m_vehicle == null)
|
||||
return (int)Vehicle.TYPE_NONE;
|
||||
else
|
||||
return (int)m_vehicle.Type;
|
||||
}
|
||||
set
|
||||
{
|
||||
SetVehicleType(value);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetVehicleType(int type)
|
||||
{
|
||||
if (PhysActor != null)
|
||||
m_vehicle = null;
|
||||
if (type == (int)Vehicle.TYPE_NONE)
|
||||
{
|
||||
if (_parentID ==0 && PhysActor != null)
|
||||
PhysActor.VehicleType = (int)Vehicle.TYPE_NONE;
|
||||
return;
|
||||
}
|
||||
m_vehicle = new SOPVehicle();
|
||||
m_vehicle.ProcessTypeChange((Vehicle)type);
|
||||
{
|
||||
if (_parentID ==0 && PhysActor != null)
|
||||
PhysActor.VehicleType = type;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public void SetVehicleFlags(int param, bool remove)
|
||||
{
|
||||
if (m_vehicle == null)
|
||||
return;
|
||||
|
||||
m_vehicle.ProcessVehicleFlags(param, remove);
|
||||
|
||||
if (_parentID ==0 && PhysActor != null)
|
||||
{
|
||||
PhysActor.VehicleType = type;
|
||||
PhysActor.VehicleFlags(param, remove);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetVehicleFloatParam(int param, float value)
|
||||
{
|
||||
if (PhysActor != null)
|
||||
if (m_vehicle == null)
|
||||
return;
|
||||
|
||||
m_vehicle.ProcessFloatVehicleParam((Vehicle)param, value);
|
||||
|
||||
if (_parentID == 0 && PhysActor != null)
|
||||
{
|
||||
PhysActor.VehicleFloatParam(param, value);
|
||||
}
|
||||
@@ -3181,7 +3242,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
public void SetVehicleVectorParam(int param, Vector3 value)
|
||||
{
|
||||
if (PhysActor != null)
|
||||
if (m_vehicle == null)
|
||||
return;
|
||||
|
||||
m_vehicle.ProcessVectorVehicleParam((Vehicle)param, value);
|
||||
|
||||
if (_parentID == 0 && PhysActor != null)
|
||||
{
|
||||
PhysActor.VehicleVectorParam(param, value);
|
||||
}
|
||||
@@ -3189,7 +3255,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
public void SetVehicleRotationParam(int param, Quaternion rotation)
|
||||
{
|
||||
if (PhysActor != null)
|
||||
if (m_vehicle == null)
|
||||
return;
|
||||
|
||||
m_vehicle.ProcessRotationVehicleParam((Vehicle)param, rotation);
|
||||
|
||||
if (_parentID == 0 && PhysActor != null)
|
||||
{
|
||||
PhysActor.VehicleRotationParam(param, rotation);
|
||||
}
|
||||
@@ -3376,13 +3447,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
hasProfileCut = hasDimple; // is it the same thing?
|
||||
}
|
||||
|
||||
public void SetVehicleFlags(int param, bool remove)
|
||||
{
|
||||
if (PhysActor != null)
|
||||
{
|
||||
PhysActor.VehicleFlags(param, remove);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetGroup(UUID groupID, IClientAPI client)
|
||||
{
|
||||
@@ -4270,7 +4334,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
/// <param name="SetTemporary"></param>
|
||||
/// <param name="SetPhantom"></param>
|
||||
/// <param name="SetVD"></param>
|
||||
public void UpdatePrimFlags(bool UsePhysics, bool SetTemporary, bool SetPhantom, bool SetVD)
|
||||
// public void UpdatePrimFlags(bool UsePhysics, bool SetTemporary, bool SetPhantom, bool SetVD)
|
||||
public void UpdatePrimFlags(bool UsePhysics, bool SetTemporary, bool SetPhantom, bool SetVD, bool building)
|
||||
{
|
||||
bool wasUsingPhysics = ((Flags & PrimFlags.Physics) != 0);
|
||||
bool wasTemporary = ((Flags & PrimFlags.TemporaryOnRez) != 0);
|
||||
@@ -4288,6 +4353,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
// that...
|
||||
// ... if VD is changed, all others are not.
|
||||
// ... if one of the others is changed, VD is not.
|
||||
// do this first
|
||||
if (building && PhysActor != null && PhysActor.Building != building)
|
||||
PhysActor.Building = building;
|
||||
if (SetVD) // VD is active, special logic applies
|
||||
{
|
||||
// State machine logic for VolumeDetect
|
||||
@@ -4369,11 +4437,17 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
Shape,
|
||||
AbsolutePosition,
|
||||
Scale,
|
||||
RotationOffset,
|
||||
// RotationOffset,
|
||||
GetWorldRotation(), //physics wants world rotation like all other functions send
|
||||
UsePhysics,
|
||||
m_localId);
|
||||
|
||||
PhysActor.SetMaterial(Material);
|
||||
|
||||
// if root part apply vehicle
|
||||
if (m_vehicle != null && LocalId == ParentGroup.RootPart.LocalId)
|
||||
m_vehicle.SetVehicle(PhysActor);
|
||||
|
||||
DoPhysicsPropertyUpdate(UsePhysics, true);
|
||||
|
||||
if (!ParentGroup.IsDeleted)
|
||||
@@ -4449,6 +4523,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
}
|
||||
// m_log.Debug("Update: PHY:" + UsePhysics.ToString() + ", T:" + IsTemporary.ToString() + ", PHA:" + IsPhantom.ToString() + " S:" + CastsShadows.ToString());
|
||||
|
||||
// and last in case we have a new actor and not building
|
||||
if (PhysActor != null && PhysActor.Building != building)
|
||||
PhysActor.Building = building;
|
||||
if (ParentGroup != null)
|
||||
{
|
||||
ParentGroup.HasGroupChanged = true;
|
||||
|
||||
@@ -1843,8 +1843,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
// m_log.DebugFormat("[SCENE PRESENCE]: StandUp() for {0}", Name);
|
||||
|
||||
SitGround = false;
|
||||
|
||||
/* move this down so avatar gets physical in the new position and not where it is siting
|
||||
if (PhysicsActor == null)
|
||||
AddToPhysicalScene(false);
|
||||
*/
|
||||
|
||||
if (ParentID != 0)
|
||||
{
|
||||
@@ -1879,6 +1882,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
ParentPosition = Vector3.Zero;
|
||||
|
||||
ParentID = 0;
|
||||
|
||||
if (PhysicsActor == null)
|
||||
AddToPhysicalScene(false);
|
||||
|
||||
SendAvatarDataToAllAgents();
|
||||
m_requestedSitTargetID = 0;
|
||||
|
||||
@@ -1886,6 +1893,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK);
|
||||
}
|
||||
|
||||
else if (PhysicsActor == null)
|
||||
AddToPhysicalScene(false);
|
||||
|
||||
Animator.TrySetMovementAnimation("STAND");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user