OpenSim
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros
BSConstraint.cs
Go to the documentation of this file.
1 /*
2  * Copyright (c) Contributors, http://opensimulator.org/
3  * See CONTRIBUTORS.TXT for a full list of copyright holders.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyrightD
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of the OpenSimulator Project nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 using System;
28 using System.Collections.Generic;
29 using System.Text;
30 using OpenMetaverse;
31 
32 namespace OpenSim.Region.PhysicsModule.BulletS
33 {
34 
35 public abstract class BSConstraint : IDisposable
36 {
37  private static string LogHeader = "[BULLETSIM CONSTRAINT]";
38 
39  protected BulletWorld m_world;
40  protected BSScene PhysicsScene;
41  protected BulletBody m_body1;
42  protected BulletBody m_body2;
44  protected bool m_enabled = false;
45 
46  public BulletBody Body1 { get { return m_body1; } }
47  public BulletBody Body2 { get { return m_body2; } }
48  public BulletConstraint Constraint { get { return m_constraint; } }
49  public abstract ConstraintType Type { get; }
50  public bool IsEnabled { get { return m_enabled; } }
51 
52  public BSConstraint(BulletWorld world)
53  {
54  m_world = world;
55  PhysicsScene = m_world.physicsScene;
56  }
57 
58  public virtual void Dispose()
59  {
60  if (m_enabled)
61  {
62  m_enabled = false;
63  if (m_constraint.HasPhysicalConstraint)
64  {
65  bool success = PhysicsScene.PE.DestroyConstraint(m_world, m_constraint);
66  m_world.physicsScene.DetailLog("{0},BSConstraint.Dispose,taint,id1={1},body1={2},id2={3},body2={4},success={5}",
67  m_body1.ID,
68  m_body1.ID, m_body1.AddrString,
69  m_body2.ID, m_body2.AddrString,
70  success);
71  m_constraint.Clear();
72  }
73  }
74  }
75 
76  public virtual bool SetLinearLimits(Vector3 low, Vector3 high)
77  {
78  bool ret = false;
79  if (m_enabled)
80  {
81  m_world.physicsScene.DetailLog("{0},BSConstraint.SetLinearLimits,taint,low={1},high={2}", m_body1.ID, low, high);
82  ret = PhysicsScene.PE.SetLinearLimits(m_constraint, low, high);
83  }
84  return ret;
85  }
86 
87  public virtual bool SetAngularLimits(Vector3 low, Vector3 high)
88  {
89  bool ret = false;
90  if (m_enabled)
91  {
92  m_world.physicsScene.DetailLog("{0},BSConstraint.SetAngularLimits,taint,low={1},high={2}", m_body1.ID, low, high);
93  ret = PhysicsScene.PE.SetAngularLimits(m_constraint, low, high);
94  }
95  return ret;
96  }
97 
98  public virtual bool SetSolverIterations(float cnt)
99  {
100  bool ret = false;
101  if (m_enabled)
102  {
103  PhysicsScene.PE.SetConstraintNumSolverIterations(m_constraint, cnt);
104  ret = true;
105  }
106  return ret;
107  }
108 
109  public virtual bool CalculateTransforms()
110  {
111  bool ret = false;
112  if (m_enabled)
113  {
114  // Recompute the internal transforms
115  PhysicsScene.PE.CalculateTransforms(m_constraint);
116  ret = true;
117  }
118  return ret;
119  }
120 
121  // Reset this constraint making sure it has all its internal structures
122  // recomputed and is enabled and ready to go.
123  public virtual bool RecomputeConstraintVariables(float mass)
124  {
125  bool ret = false;
126  if (m_enabled)
127  {
128  ret = CalculateTransforms();
129  if (ret)
130  {
131  // Setting an object's mass to zero (making it static like when it's selected)
132  // automatically disables the constraints.
133  // If the link is enabled, be sure to set the constraint itself to enabled.
134  PhysicsScene.PE.SetConstraintEnable(m_constraint, BSParam.NumericBool(true));
135  }
136  else
137  {
138  m_world.physicsScene.Logger.ErrorFormat("{0} CalculateTransforms failed. A={1}, B={2}", LogHeader, Body1.ID, Body2.ID);
139  }
140  }
141  return ret;
142  }
143 }
144 }
virtual bool SetAngularLimits(Vector3 low, Vector3 high)
Definition: BSConstraint.cs:87
virtual bool SetLinearLimits(Vector3 low, Vector3 high)
Definition: BSConstraint.cs:76
virtual bool RecomputeConstraintVariables(float mass)