aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared/Api/Implementation
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs213
1 files changed, 213 insertions, 0 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 4c3f7ee..6c094ee 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -4404,5 +4404,218 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4404 m_host.ScriptSetVolumeDetect(detect != 0); 4404 m_host.ScriptSetVolumeDetect(detect != 0);
4405 } 4405 }
4406 4406
4407 /// <summary>
4408 /// Get inertial data
4409 /// </summary>
4410 /// <remarks>
4411 /// </remarks>
4412 /// <returns>
4413 /// a LSL list with contents:
4414 /// LSL_Float mass, the total mass of a linkset
4415 /// LSL_Vector CenterOfMass, center mass relative to root prim
4416 /// LSL_Vector Inertia, elements of diagonal of inertia Ixx,Iyy,Izz divided by total mass
4417 /// LSL_Vector aux, elements of upper triagle of inertia Ixy (= Iyx), Ixz (= Izx), Iyz(= Izy) divided by total mass
4418 /// </returns>
4419 public LSL_List osGetInertiaData()
4420 {
4421 LSL_List result = new LSL_List();
4422 float TotalMass;
4423 Vector3 CenterOfMass;
4424 Vector3 Inertia;
4425 Vector4 aux;
4426
4427 SceneObjectGroup sog = m_host.ParentGroup;
4428 if(sog== null || sog.IsDeleted)
4429 return result;
4430
4431 sog.GetInertiaData(out TotalMass, out CenterOfMass, out Inertia, out aux );
4432 if(TotalMass > 0)
4433 {
4434 float t = 1.0f/TotalMass;
4435 Inertia.X *= t;
4436 Inertia.Y *= t;
4437 Inertia.Z *= t;
4438
4439 aux.X *= t;
4440 aux.Y *= t;
4441 aux.Z *= t;
4442 }
4443
4444 result.Add(new LSL_Float(TotalMass));
4445 result.Add(new LSL_Vector(CenterOfMass.X, CenterOfMass.Y, CenterOfMass.Z));
4446 result.Add(new LSL_Vector(Inertia.X, Inertia.Y, Inertia.Z));
4447 result.Add(new LSL_Vector(aux.X, aux.Y, aux.Z));
4448 return result;
4449 }
4450
4451 /// <summary>
4452 /// set inertial data
4453 /// replaces the automatic calculation of mass, center of mass and inertia
4454 ///
4455 /// </summary>
4456 /// <param name="Mass">total mass of linkset</param>
4457 /// <param name="centerOfMass">location of center of mass relative to root prim in local coords</param>
4458 /// <param name="principalInertiaScaled">moment of inertia relative to principal axis and center of mass,Ixx, Iyy, Izz divided by mass</param>
4459 /// <param name="lslrot">rotation of the inertia, relative to local axis</param>
4460 /// <remarks>
4461 /// the inertia argument is is inertia divided by mass, so corresponds only to the geometric distribution of mass and both can be changed independently.
4462 /// </remarks>
4463
4464 public void osSetInertia(LSL_Float mass, LSL_Vector centerOfMass, LSL_Vector principalInertiaScaled, LSL_Rotation lslrot)
4465 {
4466 SceneObjectGroup sog = m_host.ParentGroup;
4467 if(sog== null || sog.IsDeleted)
4468 return;
4469
4470 if(mass < 0 || principalInertiaScaled.x < 0 || principalInertiaScaled.y < 0 || principalInertiaScaled.z < 0)
4471 return;
4472
4473 // need more checks
4474
4475 Vector3 CenterOfMass = new Vector3((float)centerOfMass.x,(float)centerOfMass.y,(float)centerOfMass.z);
4476 Vector3 Inertia;
4477 float m = (float)mass;
4478
4479 Inertia.X = m * (float)principalInertiaScaled.x;
4480 Inertia.Y = m * (float)principalInertiaScaled.y;
4481 Inertia.Z = m * (float)principalInertiaScaled.z;
4482
4483 Vector4 rot = new Vector4((float)lslrot.x, (float)lslrot.y, (float)lslrot.y, (float)lslrot.s);
4484 rot.Normalize();
4485
4486 sog.SetInertiaData(m, CenterOfMass, Inertia, rot );
4487 }
4488
4489 /// <summary>
4490 /// set inertial data as a sphere
4491 /// replaces the automatic calculation of mass, center of mass and inertia
4492 ///
4493 /// </summary>
4494 /// <param name="Mass">total mass of linkset</param>
4495 /// <param name="boxsize">size of the Box</param>
4496 /// <param name="centerOfMass">location of center of mass relative to root prim in local coords</param>
4497 /// <param name="lslrot">rotation of the box, and so inertia, relative to local axis</param>
4498 /// <remarks>
4499 /// </remarks>
4500 public void osSetInertiaAsBox(LSL_Float mass, LSL_Vector boxSize, LSL_Vector centerOfMass, LSL_Rotation lslrot)
4501 {
4502 SceneObjectGroup sog = m_host.ParentGroup;
4503 if(sog== null || sog.IsDeleted)
4504 return;
4505
4506 if(mass < 0)
4507 return;
4508
4509 // need more checks
4510
4511 Vector3 CenterOfMass = new Vector3((float)centerOfMass.x,(float)centerOfMass.y,(float)centerOfMass.z);
4512 Vector3 Inertia;
4513 float lx = (float)boxSize.x;
4514 float ly = (float)boxSize.y;
4515 float lz = (float)boxSize.z;
4516 float m = (float)mass;
4517 float t = m / 12.0f;
4518
4519 Inertia.X = t * (ly*ly + lz*lz);
4520 Inertia.Y = t * (lx*lx + lz*lz);
4521 Inertia.Z = t * (lx*lx + ly*ly);
4522
4523 Vector4 rot = new Vector4((float)lslrot.x, (float)lslrot.y, (float)lslrot.z, (float)lslrot.s);
4524 rot.Normalize();
4525
4526 sog.SetInertiaData(m, CenterOfMass, Inertia, rot );
4527 }
4528
4529 /// <summary>
4530 /// set inertial data as a sphere
4531 /// replaces the automatic calculation of mass, center of mass and inertia
4532 ///
4533 /// </summary>
4534 /// <param name="Mass">total mass of linkset</param>
4535 /// <param name="radius">radius of the sphere</param>
4536 /// <param name="centerOfMass">location of center of mass relative to root prim in local coords</param>
4537 /// <remarks>
4538 /// </remarks>
4539 public void osSetInertiaAsSphere(LSL_Float mass, LSL_Float radius, LSL_Vector centerOfMass)
4540 {
4541 SceneObjectGroup sog = m_host.ParentGroup;
4542 if(sog== null || sog.IsDeleted)
4543 return;
4544
4545 if(mass < 0)
4546 return;
4547
4548 // need more checks
4549
4550 Vector3 CenterOfMass = new Vector3((float)centerOfMass.x,(float)centerOfMass.y,(float)centerOfMass.z);
4551 Vector3 Inertia;
4552 float r = (float)radius;
4553 float m = (float)mass;
4554 float t = 0.4f * m * r * r;
4555
4556 Inertia.X = t;
4557 Inertia.Y = t;
4558 Inertia.Z = t;
4559
4560 sog.SetInertiaData(m, CenterOfMass, Inertia, new Vector4(0f, 0f, 0f,1.0f));
4561 }
4562
4563 /// <summary>
4564 /// set inertial data as a cylinder
4565 /// replaces the automatic calculation of mass, center of mass and inertia
4566 ///
4567 /// </summary>
4568 /// <param name="Mass">total mass of linkset</param>
4569 /// <param name="radius">radius of the cylinder</param>
4570 /// <param name="lenght">lenght of the cylinder</param>
4571 /// <param name="centerOfMass">location of center of mass relative to root prim in local coords</param>
4572 /// <param name="lslrot">rotation of the cylinder, and so inertia, relative to local axis</param>
4573 /// <remarks>
4574 /// cylinder axis aligned with Z axis. For other orientations provide the rotation.
4575 /// </remarks>
4576 public void osSetInertiaAsCylinder(LSL_Float mass, LSL_Float radius, LSL_Float lenght, LSL_Vector centerOfMass, LSL_Rotation lslrot)
4577 {
4578 SceneObjectGroup sog = m_host.ParentGroup;
4579 if(sog== null || sog.IsDeleted)
4580 return;
4581
4582 if(mass < 0)
4583 return;
4584
4585 // need more checks
4586
4587 Vector3 CenterOfMass = new Vector3((float)centerOfMass.x,(float)centerOfMass.y,(float)centerOfMass.z);
4588 Vector3 Inertia;
4589 float m = (float)mass;
4590 float r = (float)radius;
4591 r *= r;
4592 Inertia.Z = 0.5f * m * r;
4593 float t = (float)lenght;
4594 t *= t;
4595 t += 3.0f * r;
4596 t *= 8.333333e-2f * m;
4597
4598 Inertia.X = t;
4599 Inertia.Y = t;
4600
4601 Vector4 rot = new Vector4((float)lslrot.x, (float)lslrot.y, (float)lslrot.z, (float)lslrot.s);
4602 rot.Normalize();
4603
4604 sog.SetInertiaData(m, CenterOfMass, Inertia, rot);
4605 }
4606
4607 /// <summary>
4608 /// removes inertial data manual override
4609 /// default automatic calculation is used again
4610 ///
4611 /// </summary>
4612 public void osClearInertia()
4613 {
4614 SceneObjectGroup sog = m_host.ParentGroup;
4615 if(sog== null || sog.IsDeleted)
4616 return;
4617
4618 sog.SetInertiaData(-1, Vector3.Zero, Vector3.Zero, Vector4.Zero );
4619 }
4407 } 4620 }
4408} 4621}