diff options
author | Teravus Ovares | 2008-05-01 06:31:12 +0000 |
---|---|---|
committer | Teravus Ovares | 2008-05-01 06:31:12 +0000 |
commit | 1c697ef0d206445c6819e338626169fc6ef56432 (patch) | |
tree | 88d6b26b5982eb73f75a5f051c2f068c1d8d8f27 | |
parent | * Fix OBB raycaster to respond properly to rays cast from any direction. (diff) | |
download | opensim-SC-1c697ef0d206445c6819e338626169fc6ef56432.zip opensim-SC-1c697ef0d206445c6819e338626169fc6ef56432.tar.gz opensim-SC-1c697ef0d206445c6819e338626169fc6ef56432.tar.bz2 opensim-SC-1c697ef0d206445c6819e338626169fc6ef56432.tar.xz |
* You can now rez objects out of inventory at the correct offset from prim you rez it on. Including multi prim groups and prim that have different X/Y/Z scales.
-rw-r--r-- | OpenSim/Region/Environment/Scenes/EntityBase.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/InnerScene.cs | 4 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.Inventory.cs | 15 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.cs | 19 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | 31 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | 13 |
6 files changed, 69 insertions, 15 deletions
diff --git a/OpenSim/Region/Environment/Scenes/EntityBase.cs b/OpenSim/Region/Environment/Scenes/EntityBase.cs index 1faba9a..11bafb7 100644 --- a/OpenSim/Region/Environment/Scenes/EntityBase.cs +++ b/OpenSim/Region/Environment/Scenes/EntityBase.cs | |||
@@ -222,6 +222,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
222 | { | 222 | { |
223 | public Vector3 ipoint = new Vector3(0, 0, 0); | 223 | public Vector3 ipoint = new Vector3(0, 0, 0); |
224 | public Vector3 normal = new Vector3(0, 0, 0); | 224 | public Vector3 normal = new Vector3(0, 0, 0); |
225 | public Vector3 AAfaceNormal = new Vector3(0, 0, 0); | ||
226 | public int face = -1; | ||
225 | public bool HitTF = false; | 227 | public bool HitTF = false; |
226 | public SceneObjectPart obj; | 228 | public SceneObjectPart obj; |
227 | public float distance = 0; | 229 | public float distance = 0; |
diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs index 8a48f6e..5434a88 100644 --- a/OpenSim/Region/Environment/Scenes/InnerScene.cs +++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs | |||
@@ -853,7 +853,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
853 | return null; | 853 | return null; |
854 | } | 854 | } |
855 | 855 | ||
856 | public EntityIntersection GetClosestIntersectingPrim(Ray hray) | 856 | public EntityIntersection GetClosestIntersectingPrim(Ray hray, bool frontFacesOnly) |
857 | { | 857 | { |
858 | // Primitive Ray Tracing | 858 | // Primitive Ray Tracing |
859 | float closestDistance = 280f; | 859 | float closestDistance = 280f; |
@@ -863,7 +863,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
863 | if (ent is SceneObjectGroup) | 863 | if (ent is SceneObjectGroup) |
864 | { | 864 | { |
865 | SceneObjectGroup reportingG = (SceneObjectGroup)ent; | 865 | SceneObjectGroup reportingG = (SceneObjectGroup)ent; |
866 | EntityIntersection result = reportingG.TestIntersection(hray); | 866 | EntityIntersection result = reportingG.TestIntersection(hray, frontFacesOnly); |
867 | if (result.HitTF) | 867 | if (result.HitTF) |
868 | { | 868 | { |
869 | if (result.distance < closestDistance) | 869 | if (result.distance < closestDistance) |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index 7e1b89f..7866b32 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs | |||
@@ -1235,10 +1235,12 @@ namespace OpenSim.Region.Environment.Scenes | |||
1235 | bRayEndIsIntersection = (byte)0; | 1235 | bRayEndIsIntersection = (byte)0; |
1236 | } | 1236 | } |
1237 | 1237 | ||
1238 | LLVector3 pos | 1238 | LLVector3 scale = new LLVector3(0.5f, 0.5f, 0.5f); |
1239 | = GetNewRezLocation( | 1239 | |
1240 | |||
1241 | LLVector3 pos = GetNewRezLocation( | ||
1240 | RayStart, RayEnd, RayTargetID, new LLQuaternion(0, 0, 0, 1), | 1242 | RayStart, RayEnd, RayTargetID, new LLQuaternion(0, 0, 0, 1), |
1241 | BypassRayCast, bRayEndIsIntersection); | 1243 | BypassRayCast, bRayEndIsIntersection,true,scale); |
1242 | 1244 | ||
1243 | if (!PermissionsMngr.CanRezObject(remoteClient.AgentId, pos) && !attachment) | 1245 | if (!PermissionsMngr.CanRezObject(remoteClient.AgentId, pos) && !attachment) |
1244 | { | 1246 | { |
@@ -1266,9 +1268,16 @@ namespace OpenSim.Region.Environment.Scenes | |||
1266 | // if attachment we set it's asset id so object updates can reflect that | 1268 | // if attachment we set it's asset id so object updates can reflect that |
1267 | // if not, we set it's position in world. | 1269 | // if not, we set it's position in world. |
1268 | if (!attachment) | 1270 | if (!attachment) |
1271 | { | ||
1272 | pos = GetNewRezLocation( | ||
1273 | RayStart, RayEnd, RayTargetID, new LLQuaternion(0, 0, 0, 1), | ||
1274 | BypassRayCast, bRayEndIsIntersection, true, group.GroupScale()); | ||
1269 | group.AbsolutePosition = pos; | 1275 | group.AbsolutePosition = pos; |
1276 | } | ||
1270 | else | 1277 | else |
1278 | { | ||
1271 | group.SetFromAssetID(itemID); | 1279 | group.SetFromAssetID(itemID); |
1280 | } | ||
1272 | 1281 | ||
1273 | SceneObjectPart rootPart = group.GetChildPart(group.UUID); | 1282 | SceneObjectPart rootPart = group.GetChildPart(group.UUID); |
1274 | 1283 | ||
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index b5ead2a..203f6d3 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -1172,7 +1172,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1172 | return myID; | 1172 | return myID; |
1173 | } | 1173 | } |
1174 | 1174 | ||
1175 | public LLVector3 GetNewRezLocation(LLVector3 RayStart, LLVector3 RayEnd, LLUUID RayTargetID, LLQuaternion rot, byte bypassRayCast, byte RayEndIsIntersection) | 1175 | public LLVector3 GetNewRezLocation(LLVector3 RayStart, LLVector3 RayEnd, LLUUID RayTargetID, LLQuaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, LLVector3 scale) |
1176 | { | 1176 | { |
1177 | LLVector3 pos = LLVector3.Zero; | 1177 | LLVector3 pos = LLVector3.Zero; |
1178 | if (RayEndIsIntersection == (byte)1) | 1178 | if (RayEndIsIntersection == (byte)1) |
@@ -1199,18 +1199,24 @@ namespace OpenSim.Region.Environment.Scenes | |||
1199 | Ray NewRay = new Ray(AXOrigin, AXdirection); | 1199 | Ray NewRay = new Ray(AXOrigin, AXdirection); |
1200 | 1200 | ||
1201 | // Ray Trace against target here | 1201 | // Ray Trace against target here |
1202 | EntityIntersection ei = target.TestIntersectionOBB(NewRay, new Quaternion(1,0,0,0)); | 1202 | EntityIntersection ei = target.TestIntersectionOBB(NewRay, new Quaternion(1,0,0,0), frontFacesOnly); |
1203 | 1203 | ||
1204 | // Un-comment out the following line to Get Raytrace results printed to the console. | 1204 | // Un-comment out the following line to Get Raytrace results printed to the console. |
1205 | // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString()); | 1205 | // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString()); |
1206 | 1206 | float ScaleOffset = 0.5f; | |
1207 | |||
1207 | // If we hit something | 1208 | // If we hit something |
1208 | if (ei.HitTF) | 1209 | if (ei.HitTF) |
1209 | { | 1210 | { |
1211 | LLVector3 scaleComponent = new LLVector3(ei.AAfaceNormal.x, ei.AAfaceNormal.y, ei.AAfaceNormal.z); | ||
1212 | if (scaleComponent.X != 0) ScaleOffset = scale.X; | ||
1213 | if (scaleComponent.Y != 0) ScaleOffset = scale.Y; | ||
1214 | if (scaleComponent.Z != 0) ScaleOffset = scale.Z; | ||
1215 | ScaleOffset = Math.Abs(ScaleOffset); | ||
1210 | LLVector3 intersectionpoint = new LLVector3(ei.ipoint.x, ei.ipoint.y, ei.ipoint.z); | 1216 | LLVector3 intersectionpoint = new LLVector3(ei.ipoint.x, ei.ipoint.y, ei.ipoint.z); |
1211 | LLVector3 normal = new LLVector3(ei.normal.x, ei.normal.y, ei.normal.z); | 1217 | LLVector3 normal = new LLVector3(ei.normal.x, ei.normal.y, ei.normal.z); |
1212 | // Set the position to the intersection point | 1218 | // Set the position to the intersection point |
1213 | LLVector3 offset = (normal * (0.5f / 2f)); | 1219 | LLVector3 offset = (normal * (ScaleOffset / 2f)); |
1214 | pos = (intersectionpoint + offset); | 1220 | pos = (intersectionpoint + offset); |
1215 | 1221 | ||
1216 | // Un-offset the prim (it gets offset later by the consumer method) | 1222 | // Un-offset the prim (it gets offset later by the consumer method) |
@@ -1225,7 +1231,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1225 | { | 1231 | { |
1226 | // We don't have a target here, so we're going to raytrace all the objects in the scene. | 1232 | // We don't have a target here, so we're going to raytrace all the objects in the scene. |
1227 | 1233 | ||
1228 | EntityIntersection ei = m_innerScene.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection)); | 1234 | EntityIntersection ei = m_innerScene.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection), true); |
1229 | 1235 | ||
1230 | // Un-comment the following line to print the raytrace results to the console. | 1236 | // Un-comment the following line to print the raytrace results to the console. |
1231 | //m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString()); | 1237 | //m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString()); |
@@ -1250,7 +1256,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
1250 | byte bypassRaycast, LLVector3 RayStart, LLUUID RayTargetID, | 1256 | byte bypassRaycast, LLVector3 RayStart, LLUUID RayTargetID, |
1251 | byte RayEndIsIntersection) | 1257 | byte RayEndIsIntersection) |
1252 | { | 1258 | { |
1253 | LLVector3 pos = GetNewRezLocation(RayStart, RayEnd, RayTargetID, rot, bypassRaycast, RayEndIsIntersection); | 1259 | |
1260 | LLVector3 pos = GetNewRezLocation(RayStart, RayEnd, RayTargetID, rot, bypassRaycast, RayEndIsIntersection, true, new LLVector3(0.5f,0.5f,0.5f)); | ||
1254 | 1261 | ||
1255 | if (PermissionsMngr.CanRezObject(ownerID, pos)) | 1262 | if (PermissionsMngr.CanRezObject(ownerID, pos)) |
1256 | { | 1263 | { |
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 863146c..5164d30 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | |||
@@ -516,8 +516,35 @@ namespace OpenSim.Region.Environment.Scenes | |||
516 | m_scene.EventManager.OnBackup += ProcessBackup; | 516 | m_scene.EventManager.OnBackup += ProcessBackup; |
517 | } | 517 | } |
518 | } | 518 | } |
519 | public LLVector3 GroupScale() | ||
520 | { | ||
521 | LLVector3 minScale = new LLVector3(Constants.RegionSize,Constants.RegionSize,Constants.RegionSize); | ||
522 | LLVector3 maxScale = new LLVector3(0f,0f,0f); | ||
523 | LLVector3 finalScale = new LLVector3(0.5f, 0.5f, 0.5f); | ||
524 | |||
525 | lock (m_parts) | ||
526 | { | ||
527 | foreach (SceneObjectPart part in m_parts.Values) | ||
528 | { | ||
529 | LLVector3 partscale = part.Scale; | ||
530 | LLVector3 partoffset = part.OffsetPosition; | ||
519 | 531 | ||
520 | public EntityIntersection TestIntersection(Ray hRay) | 532 | minScale.X = (partscale.X + partoffset.X < minScale.X) ? partscale.X + partoffset.X : minScale.X; |
533 | minScale.Y = (partscale.Y + partoffset.Y < minScale.Y) ? partscale.X + partoffset.Y : minScale.Y; | ||
534 | minScale.Z = (partscale.Z + partoffset.Z < minScale.Z) ? partscale.X + partoffset.Z : minScale.Z; | ||
535 | |||
536 | maxScale.X = (partscale.X + partoffset.X > maxScale.X) ? partscale.X + partoffset.X : maxScale.X; | ||
537 | maxScale.Y = (partscale.Y + partoffset.Y > maxScale.Y) ? partscale.Y + partoffset.Y : maxScale.Y; | ||
538 | maxScale.Z = (partscale.Z + partoffset.Z > maxScale.Z) ? partscale.Z + partoffset.Z : maxScale.Z; | ||
539 | } | ||
540 | } | ||
541 | finalScale.X = (minScale.X > maxScale.X) ? minScale.X : maxScale.X; | ||
542 | finalScale.Y = (minScale.Y > maxScale.Y) ? minScale.Y : maxScale.Y; | ||
543 | finalScale.Z = (minScale.Z > maxScale.Z) ? minScale.Z : maxScale.Z; | ||
544 | return finalScale; | ||
545 | |||
546 | } | ||
547 | public EntityIntersection TestIntersection(Ray hRay, bool frontFacesOnly) | ||
521 | { | 548 | { |
522 | // We got a request from the inner_scene to raytrace along the Ray hRay | 549 | // We got a request from the inner_scene to raytrace along the Ray hRay |
523 | // We're going to check all of the prim in this group for intersection with the ray | 550 | // We're going to check all of the prim in this group for intersection with the ray |
@@ -539,7 +566,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
539 | // Telling the prim to raytrace. | 566 | // Telling the prim to raytrace. |
540 | //EntityIntersection inter = part.TestIntersection(hRay, parentrotation); | 567 | //EntityIntersection inter = part.TestIntersection(hRay, parentrotation); |
541 | 568 | ||
542 | EntityIntersection inter = part.TestIntersectionOBB(hRay, parentrotation); | 569 | EntityIntersection inter = part.TestIntersectionOBB(hRay, parentrotation,frontFacesOnly); |
543 | 570 | ||
544 | // This may need to be updated to the maximum draw distance possible.. | 571 | // This may need to be updated to the maximum draw distance possible.. |
545 | // We might (and probably will) be checking for prim creation from other sims | 572 | // We might (and probably will) be checking for prim creation from other sims |
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index 8d05987..5f91176 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | |||
@@ -1061,7 +1061,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1061 | return Math.Sqrt(dx * dx + dy * dy + dz * dz); | 1061 | return Math.Sqrt(dx * dx + dy * dy + dz * dz); |
1062 | } | 1062 | } |
1063 | 1063 | ||
1064 | public EntityIntersection TestIntersectionOBB(Ray iray, Quaternion parentrot) | 1064 | public EntityIntersection TestIntersectionOBB(Ray iray, Quaternion parentrot, bool FrontFacesOnly) |
1065 | { | 1065 | { |
1066 | // In this case we're using a rectangular prism, which has 6 faces and therefore 6 planes | 1066 | // In this case we're using a rectangular prism, which has 6 faces and therefore 6 planes |
1067 | // This breaks down into the ray---> plane equation. | 1067 | // This breaks down into the ray---> plane equation. |
@@ -1075,6 +1075,14 @@ namespace OpenSim.Region.Environment.Scenes | |||
1075 | Vector3[] FaceD = new Vector3[6]; // vertex D for Facei | 1075 | Vector3[] FaceD = new Vector3[6]; // vertex D for Facei |
1076 | 1076 | ||
1077 | Vector3[] normals = new Vector3[6]; // Normal for Facei | 1077 | Vector3[] normals = new Vector3[6]; // Normal for Facei |
1078 | Vector3[] AAfacenormals = new Vector3[6]; // Axis Aligned face normals | ||
1079 | |||
1080 | AAfacenormals[0] = new Vector3(1, 0, 0); | ||
1081 | AAfacenormals[1] = new Vector3(0, 1, 0); | ||
1082 | AAfacenormals[2] = new Vector3(-1, 0, 0); | ||
1083 | AAfacenormals[3] = new Vector3(0, -1, 0); | ||
1084 | AAfacenormals[4] = new Vector3(0, 0, 1); | ||
1085 | AAfacenormals[5] = new Vector3(0, 0, -1); | ||
1078 | 1086 | ||
1079 | Vector3 AmBa = new Vector3(0, 0, 0); // Vertex A - Vertex B | 1087 | Vector3 AmBa = new Vector3(0, 0, 0); // Vertex A - Vertex B |
1080 | Vector3 AmBb = new Vector3(0, 0, 0); // Vertex B - Vertex C | 1088 | Vector3 AmBb = new Vector3(0, 0, 0); // Vertex B - Vertex C |
@@ -1332,7 +1340,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1332 | continue; | 1340 | continue; |
1333 | 1341 | ||
1334 | // If the normal is pointing outside the object | 1342 | // If the normal is pointing outside the object |
1335 | if (iray.Direction.Dot(normals[i]) < 0) | 1343 | if (iray.Direction.Dot(normals[i]) < 0 || !FrontFacesOnly) |
1336 | { | 1344 | { |
1337 | 1345 | ||
1338 | q = iray.Origin + a * iray.Direction; | 1346 | q = iray.Origin + a * iray.Direction; |
@@ -1349,6 +1357,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1349 | //m_log.Info("[FACE]:" + i.ToString()); | 1357 | //m_log.Info("[FACE]:" + i.ToString()); |
1350 | //m_log.Info("[POINT]: " + q.ToString()); | 1358 | //m_log.Info("[POINT]: " + q.ToString()); |
1351 | returnresult.normal = normals[i]; | 1359 | returnresult.normal = normals[i]; |
1360 | returnresult.AAfaceNormal = AAfacenormals[i]; | ||
1352 | 1361 | ||
1353 | } | 1362 | } |
1354 | } | 1363 | } |