diff options
author | UbitUmarov | 2012-03-10 20:32:19 +0000 |
---|---|---|
committer | UbitUmarov | 2012-03-10 20:32:19 +0000 |
commit | 908abb1c3dded307e769abac71f660b835875975 (patch) | |
tree | 755d4e532a94346fe1960e3870f07767fbcfdd4a /OpenSim/Region/Framework/Scenes/SceneGraph.cs | |
parent | ubitOde bug (diff) | |
download | opensim-SC_OLD-908abb1c3dded307e769abac71f660b835875975.zip opensim-SC_OLD-908abb1c3dded307e769abac71f660b835875975.tar.gz opensim-SC_OLD-908abb1c3dded307e769abac71f660b835875975.tar.bz2 opensim-SC_OLD-908abb1c3dded307e769abac71f660b835875975.tar.xz |
BIG MESS. changed Iclient interface so only one event is used to inform scene about position scale or rotation change by client (others can be added). Its served at SceneGraph that does permition checks, undostore and sends down to SOG. changed values are stored in a class (ObjectChangeData) and what is changed as a enum (ObjectChangeWhat) with bit fields and 'macros' of this for better readability (at top of scenegraph.cs lasy to find better place for now) this can be extended for other things clients changes and need undo/redo. SOG process acording to what is changed. Changed UNDO/redo to use this also (warning is only storing what is changed, previus stored all, this must be checked for side efects. to save all PRS change commented line in scenegraph). Still have excessive calls to ScheduleGroupForTerseUpdate. **** UNTESTED ****
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneGraph.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneGraph.cs | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 3cd4a10..5e770ba 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -47,6 +47,57 @@ namespace OpenSim.Region.Framework.Scenes | |||
47 | 47 | ||
48 | public delegate void ChangedBackupDelegate(SceneObjectGroup sog); | 48 | public delegate void ChangedBackupDelegate(SceneObjectGroup sog); |
49 | 49 | ||
50 | |||
51 | public enum ObjectChangeWhat : uint | ||
52 | { | ||
53 | // bits definitions | ||
54 | Position = 0x01, | ||
55 | Rotation = 0x02, | ||
56 | Scale = 0x04, | ||
57 | Group = 0x08, | ||
58 | UniformScale = 0x10, | ||
59 | |||
60 | // macros from above | ||
61 | // single prim | ||
62 | primP = 0x01, | ||
63 | primR = 0x02, | ||
64 | primPR = 0x03, | ||
65 | primS = 0x04, | ||
66 | primPS = 0x05, | ||
67 | primRS = 0x06, | ||
68 | primPSR = 0x07, | ||
69 | |||
70 | primUS = 0x14, | ||
71 | primPUS = 0x15, | ||
72 | primRUS = 0x16, | ||
73 | primPUSR = 0x17, | ||
74 | |||
75 | // group | ||
76 | groupP = 0x09, | ||
77 | groupR = 0x0A, | ||
78 | groupPR = 0x0B, | ||
79 | groupS = 0x0C, | ||
80 | groupPS = 0x0D, | ||
81 | groupRS = 0x0E, | ||
82 | groupPSR = 0x0F, | ||
83 | |||
84 | groupUS = 0x1C, | ||
85 | groupPUS = 0x1D, | ||
86 | groupRUS = 0x1E, | ||
87 | groupPUSR = 0x1F, | ||
88 | |||
89 | PRSmask = 0x07 | ||
90 | } | ||
91 | |||
92 | public struct ObjectChangeData | ||
93 | { | ||
94 | public Quaternion rotation; | ||
95 | public Vector3 position; | ||
96 | public Vector3 scale; | ||
97 | public ObjectChangeWhat what; | ||
98 | } | ||
99 | |||
100 | |||
50 | /// <summary> | 101 | /// <summary> |
51 | /// This class used to be called InnerScene and may not yet truly be a SceneGraph. The non scene graph components | 102 | /// This class used to be called InnerScene and may not yet truly be a SceneGraph. The non scene graph components |
52 | /// should be migrated out over time. | 103 | /// should be migrated out over time. |
@@ -1289,6 +1340,87 @@ namespace OpenSim.Region.Framework.Scenes | |||
1289 | 1340 | ||
1290 | #region Client Event handlers | 1341 | #region Client Event handlers |
1291 | 1342 | ||
1343 | protected internal void ClientChangeObject(uint localID, object odata, IClientAPI remoteClient) | ||
1344 | { | ||
1345 | SceneObjectPart part = GetSceneObjectPart(localID); | ||
1346 | ObjectChangeData data = (ObjectChangeData)odata; | ||
1347 | |||
1348 | if (part != null) | ||
1349 | { | ||
1350 | SceneObjectGroup grp = part.ParentGroup; | ||
1351 | if (grp != null) | ||
1352 | { | ||
1353 | if (m_parentScene.Permissions.CanEditObject(grp.UUID, remoteClient.AgentId)) | ||
1354 | { | ||
1355 | // part.StoreUndoState(data.what | ObjectChangeWhat.PRSmask); // for now save all to keep previus behavour ??? | ||
1356 | part.StoreUndoState(data.what); // lets test only saving what we changed | ||
1357 | grp.doChangeObject(part, (ObjectChangeData)data); | ||
1358 | } | ||
1359 | } | ||
1360 | } | ||
1361 | } | ||
1362 | |||
1363 | /* moved to SOG | ||
1364 | protected internal void doChangeObject(SceneObjectPart part, ObjectChangeData data) | ||
1365 | { | ||
1366 | if (part != null && part.ParentGroup != null) | ||
1367 | { | ||
1368 | ObjectChangeWhat what = data.what; | ||
1369 | bool togroup = ((what & ObjectChangeWhat.Group) != 0); | ||
1370 | // bool uniform = ((what & ObjectChangeWhat.UniformScale) != 0); not in use | ||
1371 | |||
1372 | SceneObjectGroup group = part.ParentGroup; | ||
1373 | PhysicsActor pha = group.RootPart.PhysActor; | ||
1374 | |||
1375 | if (togroup) | ||
1376 | { | ||
1377 | // related to group | ||
1378 | if ((what & ObjectChangeWhat.Position) != 0) | ||
1379 | group.AbsolutePosition = data.position; | ||
1380 | if ((what & ObjectChangeWhat.Rotation) != 0) | ||
1381 | group.RootPart.UpdateRotation(data.rotation); | ||
1382 | if ((what & ObjectChangeWhat.Scale) != 0) | ||
1383 | { | ||
1384 | if (pha != null) | ||
1385 | pha.Building = true; | ||
1386 | group.GroupResize(data.scale); | ||
1387 | if (pha != null) | ||
1388 | pha.Building = false; | ||
1389 | } | ||
1390 | } | ||
1391 | else | ||
1392 | { | ||
1393 | // related to single prim in a link-set ( ie group) | ||
1394 | if (pha != null) | ||
1395 | pha.Building = true; | ||
1396 | |||
1397 | // must deal with root part specially for position and rotation | ||
1398 | // so parts offset positions or rotations are fixed | ||
1399 | |||
1400 | if (part == group.RootPart) | ||
1401 | { | ||
1402 | if ((what & ObjectChangeWhat.Position) != 0) | ||
1403 | group.UpdateRootPosition(data.position); | ||
1404 | if ((what & ObjectChangeWhat.Rotation) != 0) | ||
1405 | group.UpdateRootRotation(data.rotation); | ||
1406 | } | ||
1407 | else | ||
1408 | { | ||
1409 | if ((what & ObjectChangeWhat.Position) != 0) | ||
1410 | part.OffsetPosition = data.position; | ||
1411 | if ((what & ObjectChangeWhat.Rotation) != 0) | ||
1412 | part.UpdateRotation(data.rotation); | ||
1413 | } | ||
1414 | |||
1415 | if ((what & ObjectChangeWhat.Scale) != 0) | ||
1416 | part.Resize(data.scale); | ||
1417 | |||
1418 | if (pha != null) | ||
1419 | pha.Building = false; | ||
1420 | } | ||
1421 | } | ||
1422 | } | ||
1423 | */ | ||
1292 | /// <summary> | 1424 | /// <summary> |
1293 | /// Update the scale of an individual prim. | 1425 | /// Update the scale of an individual prim. |
1294 | /// </summary> | 1426 | /// </summary> |
@@ -1303,7 +1435,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
1303 | { | 1435 | { |
1304 | if (m_parentScene.Permissions.CanEditObject(part.ParentGroup.UUID, remoteClient.AgentId)) | 1436 | if (m_parentScene.Permissions.CanEditObject(part.ParentGroup.UUID, remoteClient.AgentId)) |
1305 | { | 1437 | { |
1438 | bool physbuild = false; | ||
1439 | if (part.ParentGroup.RootPart.PhysActor != null) | ||
1440 | { | ||
1441 | part.ParentGroup.RootPart.PhysActor.Building = true; | ||
1442 | physbuild = true; | ||
1443 | } | ||
1444 | |||
1306 | part.Resize(scale); | 1445 | part.Resize(scale); |
1446 | |||
1447 | if (physbuild) | ||
1448 | part.ParentGroup.RootPart.PhysActor.Building = false; | ||
1307 | } | 1449 | } |
1308 | } | 1450 | } |
1309 | } | 1451 | } |
@@ -1315,7 +1457,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
1315 | { | 1457 | { |
1316 | if (m_parentScene.Permissions.CanEditObject(group.UUID, remoteClient.AgentId)) | 1458 | if (m_parentScene.Permissions.CanEditObject(group.UUID, remoteClient.AgentId)) |
1317 | { | 1459 | { |
1460 | bool physbuild = false; | ||
1461 | if (group.RootPart.PhysActor != null) | ||
1462 | { | ||
1463 | group.RootPart.PhysActor.Building = true; | ||
1464 | physbuild = true; | ||
1465 | } | ||
1466 | |||
1318 | group.GroupResize(scale); | 1467 | group.GroupResize(scale); |
1468 | |||
1469 | if (physbuild) | ||
1470 | group.RootPart.PhysActor.Building = false; | ||
1319 | } | 1471 | } |
1320 | } | 1472 | } |
1321 | } | 1473 | } |