diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
3 files changed, 80 insertions, 18 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 6feb333..5507aa0 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -2723,6 +2723,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2723 | // When we delete a group, we currently have to force persist to the database if the object id has changed | 2723 | // When we delete a group, we currently have to force persist to the database if the object id has changed |
2724 | // (since delete works by deleting all rows which have a given object id) | 2724 | // (since delete works by deleting all rows which have a given object id) |
2725 | 2725 | ||
2726 | // this is as it seems to be in sl now | ||
2727 | if(linkPart.PhysicsShapeType == (byte)PhysShapeType.none) | ||
2728 | linkPart.PhysicsShapeType = linkPart.DefaultPhysicsShapeType(); // root prims can't have type none for now | ||
2729 | |||
2726 | if (m_rootPart.PhysActor != null) | 2730 | if (m_rootPart.PhysActor != null) |
2727 | m_rootPart.PhysActor.Building = false; | 2731 | m_rootPart.PhysActor.Building = false; |
2728 | 2732 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index a68b3eb..84ed40c 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -986,7 +986,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
986 | public PrimitiveBaseShape Shape | 986 | public PrimitiveBaseShape Shape |
987 | { | 987 | { |
988 | get { return m_shape; } | 988 | get { return m_shape; } |
989 | set { m_shape = value;} | 989 | set |
990 | { | ||
991 | m_shape = value; | ||
992 | m_physicsShapeType = DefaultPhysicsShapeType(); | ||
993 | } | ||
990 | } | 994 | } |
991 | 995 | ||
992 | /// <summary> | 996 | /// <summary> |
@@ -1377,31 +1381,68 @@ namespace OpenSim.Region.Framework.Scenes | |||
1377 | { | 1381 | { |
1378 | if (value >= 0 && value <= (byte)SOPMaterialData.MaxMaterial) | 1382 | if (value >= 0 && value <= (byte)SOPMaterialData.MaxMaterial) |
1379 | { | 1383 | { |
1380 | m_material = (Material)value; | 1384 | bool update = false; |
1381 | m_friction = SOPMaterialData.friction(m_material); | 1385 | |
1382 | m_bounce = SOPMaterialData.bounce(m_material); | 1386 | if (m_material != (Material)value) |
1383 | if (PhysActor != null) | 1387 | { |
1388 | update = true; | ||
1389 | m_material = (Material)value; | ||
1390 | } | ||
1391 | |||
1392 | if (m_friction != SOPMaterialData.friction(m_material)) | ||
1393 | { | ||
1394 | update = true; | ||
1395 | m_friction = SOPMaterialData.friction(m_material); | ||
1396 | } | ||
1397 | |||
1398 | if (m_bounce != SOPMaterialData.bounce(m_material)) | ||
1384 | { | 1399 | { |
1385 | PhysActor.SetMaterial((int)value); | 1400 | update = true; |
1401 | m_bounce = SOPMaterialData.bounce(m_material); | ||
1402 | } | ||
1403 | |||
1404 | if (update) | ||
1405 | { | ||
1406 | if (PhysActor != null) | ||
1407 | { | ||
1408 | PhysActor.SetMaterial((int)value); | ||
1409 | } | ||
1410 | if(ParentGroup != null) | ||
1411 | ParentGroup.HasGroupChanged = true; | ||
1412 | ScheduleFullUpdateIfNone(); | ||
1386 | } | 1413 | } |
1387 | } | 1414 | } |
1388 | } | 1415 | } |
1389 | } | 1416 | } |
1390 | 1417 | ||
1418 | // not a propriety to move to methods place later | ||
1419 | public byte DefaultPhysicsShapeType() | ||
1420 | { | ||
1421 | byte type; | ||
1422 | |||
1423 | if (Shape != null && (Shape.SculptType == (byte)SculptType.Mesh)) | ||
1424 | type = (byte)PhysShapeType.convex; | ||
1425 | else | ||
1426 | type = (byte)PhysShapeType.prim; | ||
1427 | |||
1428 | return type; | ||
1429 | } | ||
1430 | |||
1391 | public byte PhysicsShapeType | 1431 | public byte PhysicsShapeType |
1392 | { | 1432 | { |
1393 | get { return m_physicsShapeType; } | 1433 | get { return m_physicsShapeType; } |
1394 | set | 1434 | set |
1395 | { | 1435 | { |
1396 | if (value < 0 || value >= (byte)PhysShapeType.convex) | 1436 | if (value >= 0 && value <= (byte)PhysShapeType.convex) |
1397 | value = (byte)PhysShapeType.prim; //convex not supported ? | ||
1398 | |||
1399 | else if (value == (byte)PhysShapeType.none) | ||
1400 | { | 1437 | { |
1401 | if (ParentGroup == null || ParentGroup.RootPart == this) | 1438 | if (value == (byte)PhysShapeType.none && ParentGroup != null && ParentGroup.RootPart == this) |
1402 | value = (byte)PhysShapeType.prim; | 1439 | m_physicsShapeType = DefaultPhysicsShapeType(); |
1440 | else | ||
1441 | m_physicsShapeType = value; | ||
1442 | ScheduleFullUpdateIfNone(); | ||
1403 | } | 1443 | } |
1404 | m_physicsShapeType = value; | 1444 | else |
1445 | m_physicsShapeType = DefaultPhysicsShapeType(); | ||
1405 | } | 1446 | } |
1406 | } | 1447 | } |
1407 | 1448 | ||
@@ -1413,6 +1454,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1413 | if (value >=1 && value <= 22587.0) | 1454 | if (value >=1 && value <= 22587.0) |
1414 | { | 1455 | { |
1415 | m_density = value; | 1456 | m_density = value; |
1457 | ScheduleFullUpdateIfNone(); | ||
1416 | } | 1458 | } |
1417 | } | 1459 | } |
1418 | } | 1460 | } |
@@ -1423,6 +1465,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1423 | set | 1465 | set |
1424 | { if( value >= -1 && value <=28.0f) | 1466 | { if( value >= -1 && value <=28.0f) |
1425 | m_gravitymod = value; | 1467 | m_gravitymod = value; |
1468 | ScheduleFullUpdateIfNone(); | ||
1426 | } | 1469 | } |
1427 | } | 1470 | } |
1428 | 1471 | ||
@@ -1434,6 +1477,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1434 | if (value >= 0 && value <= 255.0f) | 1477 | if (value >= 0 && value <= 255.0f) |
1435 | { | 1478 | { |
1436 | m_friction = value; | 1479 | m_friction = value; |
1480 | ScheduleFullUpdateIfNone(); | ||
1437 | } | 1481 | } |
1438 | } | 1482 | } |
1439 | } | 1483 | } |
@@ -1446,6 +1490,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1446 | if (value >= 0 && value <= 1.0f) | 1490 | if (value >= 0 && value <= 1.0f) |
1447 | { | 1491 | { |
1448 | m_bounce = value; | 1492 | m_bounce = value; |
1493 | ScheduleFullUpdateIfNone(); | ||
1449 | } | 1494 | } |
1450 | } | 1495 | } |
1451 | } | 1496 | } |
@@ -2942,6 +2987,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
2942 | APIDTarget = Quaternion.Identity; | 2987 | APIDTarget = Quaternion.Identity; |
2943 | } | 2988 | } |
2944 | 2989 | ||
2990 | |||
2991 | |||
2992 | public void ScheduleFullUpdateIfNone() | ||
2993 | { | ||
2994 | if (ParentGroup == null) | ||
2995 | return; | ||
2996 | |||
2997 | // ??? ParentGroup.HasGroupChanged = true; | ||
2998 | |||
2999 | if (UpdateFlag != UpdateRequired.FULL) | ||
3000 | ScheduleFullUpdate(); | ||
3001 | } | ||
3002 | |||
2945 | /// <summary> | 3003 | /// <summary> |
2946 | /// Schedules this prim for a full update | 3004 | /// Schedules this prim for a full update |
2947 | /// </summary> | 3005 | /// </summary> |
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index dfa24e5..1cd8189 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs | |||
@@ -597,22 +597,22 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
597 | 597 | ||
598 | private static void ProcessDensity(SceneObjectPart obj, XmlTextReader reader) | 598 | private static void ProcessDensity(SceneObjectPart obj, XmlTextReader reader) |
599 | { | 599 | { |
600 | obj.Density = (byte)reader.ReadElementContentAsInt("Density", String.Empty); | 600 | obj.Density = reader.ReadElementContentAsFloat("Density", String.Empty); |
601 | } | 601 | } |
602 | 602 | ||
603 | private static void ProcessFriction(SceneObjectPart obj, XmlTextReader reader) | 603 | private static void ProcessFriction(SceneObjectPart obj, XmlTextReader reader) |
604 | { | 604 | { |
605 | obj.Friction = (byte)reader.ReadElementContentAsInt("Friction", String.Empty); | 605 | obj.Friction = reader.ReadElementContentAsFloat("Friction", String.Empty); |
606 | } | 606 | } |
607 | 607 | ||
608 | private static void ProcessBounce(SceneObjectPart obj, XmlTextReader reader) | 608 | private static void ProcessBounce(SceneObjectPart obj, XmlTextReader reader) |
609 | { | 609 | { |
610 | obj.Bounciness = (byte)reader.ReadElementContentAsInt("Bounce", String.Empty); | 610 | obj.Bounciness = reader.ReadElementContentAsFloat("Bounce", String.Empty); |
611 | } | 611 | } |
612 | 612 | ||
613 | private static void ProcessGravityModifier(SceneObjectPart obj, XmlTextReader reader) | 613 | private static void ProcessGravityModifier(SceneObjectPart obj, XmlTextReader reader) |
614 | { | 614 | { |
615 | obj.GravityModifier = (byte)reader.ReadElementContentAsInt("GravityModifier", String.Empty); | 615 | obj.GravityModifier = reader.ReadElementContentAsFloat("GravityModifier", String.Empty); |
616 | } | 616 | } |
617 | 617 | ||
618 | private static void ProcessVehicle(SceneObjectPart obj, XmlTextReader reader) | 618 | private static void ProcessVehicle(SceneObjectPart obj, XmlTextReader reader) |
@@ -1321,7 +1321,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
1321 | if (sop.sopVehicle != null) | 1321 | if (sop.sopVehicle != null) |
1322 | sop.sopVehicle.ToXml2(writer); | 1322 | sop.sopVehicle.ToXml2(writer); |
1323 | 1323 | ||
1324 | if(sop.PhysicsShapeType != (byte)PhysShapeType.prim) | 1324 | if(sop.PhysicsShapeType != sop.DefaultPhysicsShapeType()) |
1325 | writer.WriteElementString("PhysicsShapeType", sop.PhysicsShapeType.ToString().ToLower()); | 1325 | writer.WriteElementString("PhysicsShapeType", sop.PhysicsShapeType.ToString().ToLower()); |
1326 | if (sop.Density != 1000.0f) | 1326 | if (sop.Density != 1000.0f) |
1327 | writer.WriteElementString("Density", sop.Density.ToString().ToLower()); | 1327 | writer.WriteElementString("Density", sop.Density.ToString().ToLower()); |