bug fix, cleanup...

avinationmerge
UbitUmarov 2013-01-03 21:53:21 +00:00
parent a285ff7e69
commit c961cfe19e
3 changed files with 34 additions and 38 deletions

View File

@ -144,7 +144,7 @@ namespace OpenSim.Region.Physics.OdePlugin
qtmp.Y = req.orientation.Y; qtmp.Y = req.orientation.Y;
qtmp.Z = req.orientation.Z; qtmp.Z = req.orientation.Z;
qtmp.W = req.orientation.W; qtmp.W = req.orientation.W;
d.GeomSetOffsetWorldQuaternion(Box, ref qtmp); d.GeomSetQuaternion(Box, ref qtmp);
} }
else if (req.callbackMethod is ProbeSphereCallback) else if (req.callbackMethod is ProbeSphereCallback)
{ {
@ -480,12 +480,12 @@ namespace OpenSim.Region.Physics.OdePlugin
if (count == 0) if (count == 0)
return; return;
/*
uint cat1 = d.GeomGetCategoryBits(g1); uint cat1 = d.GeomGetCategoryBits(g1);
uint cat2 = d.GeomGetCategoryBits(g2); uint cat2 = d.GeomGetCategoryBits(g2);
uint col1 = d.GeomGetCollideBits(g1); uint col1 = d.GeomGetCollideBits(g1);
uint col2 = d.GeomGetCollideBits(g2); uint col2 = d.GeomGetCollideBits(g2);
*/
uint ID = 0; uint ID = 0;
PhysicsActor p2 = null; PhysicsActor p2 = null;

View File

@ -78,36 +78,20 @@ namespace OpenSim.Region.Physics.OdePlugin
IntPtr geom = ((OdePrim)actor).prim_geom; IntPtr geom = ((OdePrim)actor).prim_geom;
d.Vector3 dtmp = d.GeomGetPosition(geom); Vector3 geopos = d.GeomGetPositionOMV(geom);
Vector3 geopos; Quaternion geomOri = d.GeomGetQuaternionOMV(geom);
geopos.X = dtmp.X; Quaternion geomInvOri = Quaternion.Conjugate(geomOri);
geopos.Y = dtmp.Y;
geopos.Z = dtmp.Z;
d.AABB aabb;
Quaternion ori = Quaternion.Identity; Quaternion ori = Quaternion.Identity;
d.Quaternion qtmp;
d.GeomCopyQuaternion(geom, out qtmp);
Quaternion geomOri;
geomOri.X = qtmp.X;
geomOri.Y = qtmp.Y;
geomOri.Z = qtmp.Z;
geomOri.W = qtmp.W;
Quaternion geomInvOri;
geomInvOri.X = -qtmp.X;
geomInvOri.Y = -qtmp.Y;
geomInvOri.Z = -qtmp.Z;
geomInvOri.W = qtmp.W;
Vector3 rayDir = geopos + offset - avCameraPosition; Vector3 rayDir = geopos + offset - avCameraPosition;
float raylen = rayDir.Length(); float raylen = rayDir.Length();
if (raylen < 0.001f) if (raylen < 0.001f)
{ {
PhysicsSitResponse(-1, actor.LocalID, offset, Quaternion.Identity); PhysicsSitResponse(-1, actor.LocalID, offset, Quaternion.Identity);
return; return;
} }
float t = 1 / raylen; float t = 1 / raylen;
rayDir.X *= t; rayDir.X *= t;
rayDir.Y *= t; rayDir.Y *= t;
@ -119,22 +103,25 @@ namespace OpenSim.Region.Physics.OdePlugin
rayResults = m_scene.RaycastActor(actor, avCameraPosition, rayDir, raylen, 1, RaySitFlags); rayResults = m_scene.RaycastActor(actor, avCameraPosition, rayDir, raylen, 1, RaySitFlags);
if (rayResults.Count == 0) if (rayResults.Count == 0)
{ {
/* if this fundamental ray failed, then just fail so user can try another spot and not be sitted far on a big prim
d.AABB aabb;
d.GeomGetAABB(geom, out aabb); d.GeomGetAABB(geom, out aabb);
offset = new Vector3(avOffset.X, 0, aabb.MaxZ + avOffset.Z - geopos.Z); offset = new Vector3(avOffset.X, 0, aabb.MaxZ + avOffset.Z - geopos.Z);
ori = geomInvOri; ori = geomInvOri;
offset *= geomInvOri; offset *= geomInvOri;
PhysicsSitResponse(1, actor.LocalID, offset, ori); PhysicsSitResponse(1, actor.LocalID, offset, ori);
*/
PhysicsSitResponse(0, actor.LocalID, offset, ori);
return; return;
} }
int status = 1;
offset = rayResults[0].Pos - geopos; offset = rayResults[0].Pos - geopos;
d.GeomClassID geoclass = d.GeomGetClass(geom); d.GeomClassID geoclass = d.GeomGetClass(geom);
if (geoclass == d.GeomClassID.SphereClass) if (geoclass == d.GeomClassID.SphereClass)
{ {
int status = 1;
float r = d.GeomSphereGetRadius(geom); float r = d.GeomSphereGetRadius(geom);
offset.Normalize(); offset.Normalize();
@ -165,7 +152,7 @@ namespace OpenSim.Region.Physics.OdePlugin
{ {
status = 3; status = 3;
avOffset.X = -avOffset.X; avOffset.X = -avOffset.X;
avOffset.Z += 0.4f; avOffset.Z *= 1.6f;
} }
} }
@ -186,6 +173,7 @@ namespace OpenSim.Region.Physics.OdePlugin
return; return;
} }
float SitNormX = -rayDir.X; float SitNormX = -rayDir.X;
float SitNormY = -rayDir.Y; float SitNormY = -rayDir.Y;
@ -204,7 +192,6 @@ namespace OpenSim.Region.Physics.OdePlugin
{ {
float rayDist = 4.0f; float rayDist = 4.0f;
float curEdgeDist = 0.0f; float curEdgeDist = 0.0f;
pivot = geopos + offset;
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
{ {
@ -239,11 +226,8 @@ namespace OpenSim.Region.Physics.OdePlugin
else else
{ {
foundEdge = true; foundEdge = true;
if (curEdgeDist < edgeDist) edgeDist = curEdgeDist;
{ edgePos = rayResults[0].Pos;
edgeDist = curEdgeDist;
edgePos = rayResults[0].Pos;
}
break; break;
} }
} }
@ -267,7 +251,6 @@ namespace OpenSim.Region.Physics.OdePlugin
{ {
float rayDist = 1.0f; float rayDist = 1.0f;
float curEdgeDist = 0.0f; float curEdgeDist = 0.0f;
pivot = geopos + offset;
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
{ {
@ -310,6 +293,8 @@ namespace OpenSim.Region.Physics.OdePlugin
if (foundEdge && edgeDist < 0.2f) if (foundEdge && edgeDist < 0.2f)
break; break;
pivot = geopos + offset;
switch (j) switch (j)
{ {
case 0: case 0:
@ -332,7 +317,7 @@ namespace OpenSim.Region.Physics.OdePlugin
if (!foundEdge) if (!foundEdge)
{ {
avOffset.X = -avOffset.X; avOffset.X = -avOffset.X;
avOffset.Z += 0.4f; avOffset.Z *= 1.6f;
RotAroundZ(SitNormX, SitNormY, ref ori); RotAroundZ(SitNormX, SitNormY, ref ori);
@ -349,7 +334,6 @@ namespace OpenSim.Region.Physics.OdePlugin
SitNormX = edgeNormalX; SitNormX = edgeNormalX;
SitNormY = edgeNormalY; SitNormY = edgeNormalY;
offset = edgePos - geopos;
if (edgeDirX * SitNormX + edgeDirY * SitNormY < 0) if (edgeDirX * SitNormX + edgeDirY * SitNormY < 0)
{ {
SitNormX = -SitNormX; SitNormX = -SitNormX;
@ -358,7 +342,8 @@ namespace OpenSim.Region.Physics.OdePlugin
RotAroundZ(SitNormX, SitNormY, ref ori); RotAroundZ(SitNormX, SitNormY, ref ori);
offset += avOffset * ori; offset = edgePos + avOffset * ori;
offset -= geopos;
ori = geomInvOri * ori; ori = geomInvOri * ori;
offset *= geomInvOri; offset *= geomInvOri;

View File

@ -44,7 +44,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System; using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Security; using System.Security;
using OMV = OpenMetaverse;
namespace OdeAPI namespace OdeAPI
{ {
//#if dDOUBLE //#if dDOUBLE
@ -925,9 +925,20 @@ namespace OdeAPI
{ {
unsafe { return *(GeomGetPositionUnsafe(geom)); } unsafe { return *(GeomGetPositionUnsafe(geom)); }
} }
public static OMV.Vector3 GeomGetPositionOMV(IntPtr geom)
{
Vector3 vtmp = GeomGetPosition(geom);
return new OMV.Vector3(vtmp.X, vtmp.Y, vtmp.Z);
}
[DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dGeomGetQuaternion"), SuppressUnmanagedCodeSecurity] [DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dGeomGetQuaternion"), SuppressUnmanagedCodeSecurity]
public static extern void GeomCopyQuaternion(IntPtr geom, out Quaternion q); public static extern void GeomCopyQuaternion(IntPtr geom, out Quaternion q);
public static OMV.Quaternion GeomGetQuaternionOMV(IntPtr geom)
{
Quaternion qtmp;
GeomCopyQuaternion(geom, out qtmp);
return new OMV.Quaternion(qtmp.X, qtmp.Y, qtmp.Z, qtmp.W);
}
[DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dGeomGetQuaternion"), SuppressUnmanagedCodeSecurity] [DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dGeomGetQuaternion"), SuppressUnmanagedCodeSecurity]
public static extern void GeomCopyQuaternion(IntPtr geom, out dReal X); public static extern void GeomCopyQuaternion(IntPtr geom, out dReal X);