diff options
author | Melanie Thielker | 2008-09-18 12:37:44 +0000 |
---|---|---|
committer | Melanie Thielker | 2008-09-18 12:37:44 +0000 |
commit | 1160731100fd2de002e5c717f3f8a19c41824b4a (patch) | |
tree | 0bf8388967c0ebe406271696e25c73fa1b3f38ff /OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |
parent | Kan-Ed fix series. (diff) | |
download | opensim-SC_OLD-1160731100fd2de002e5c717f3f8a19c41824b4a.zip opensim-SC_OLD-1160731100fd2de002e5c717f3f8a19c41824b4a.tar.gz opensim-SC_OLD-1160731100fd2de002e5c717f3f8a19c41824b4a.tar.bz2 opensim-SC_OLD-1160731100fd2de002e5c717f3f8a19c41824b4a.tar.xz |
XEngine API refactor. Fully implement ALL_SIDES with sanity checks.
Correct color handling functions to no longer return the inverse color.
Remove pointless * 256 / 256 legacy constructs.
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 224 |
1 files changed, 136 insertions, 88 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 054c326..c7de12f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -252,7 +252,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
252 | } | 252 | } |
253 | 253 | ||
254 | //These are the implementations of the various ll-functions used by the LSL scripts. | 254 | //These are the implementations of the various ll-functions used by the LSL scripts. |
255 | //starting out, we use the System.Math library for trig functions. - ckrinke 8-14-07 | ||
256 | public LSL_Types.LSLFloat llSin(double f) | 255 | public LSL_Types.LSLFloat llSin(double f) |
257 | { | 256 | { |
258 | m_host.AddScriptLPS(1); | 257 | m_host.AddScriptLPS(1); |
@@ -1040,7 +1039,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1040 | { | 1039 | { |
1041 | Primitive.TextureEntry tex = part.Shape.Textures; | 1040 | Primitive.TextureEntry tex = part.Shape.Textures; |
1042 | Color4 texcolor; | 1041 | Color4 texcolor; |
1043 | if (face > -1) | 1042 | if (face >= 0 && face < GetNumberOfSides(part)) |
1044 | { | 1043 | { |
1045 | texcolor = tex.CreateFace((uint)face).RGBA; | 1044 | texcolor = tex.CreateFace((uint)face).RGBA; |
1046 | texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f); | 1045 | texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f); |
@@ -1050,7 +1049,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1050 | part.UpdateTexture(tex); | 1049 | part.UpdateTexture(tex); |
1051 | return; | 1050 | return; |
1052 | } | 1051 | } |
1053 | else if (face == -1) | 1052 | else if (face == ScriptBaseClass.ALL_SIDES) |
1054 | { | 1053 | { |
1055 | for (uint i = 0; i < GetNumberOfSides(part); i++) | 1054 | for (uint i = 0; i < GetNumberOfSides(part); i++) |
1056 | { | 1055 | { |
@@ -1076,14 +1075,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1076 | public void SetGlow(SceneObjectPart part, int face, float glow) | 1075 | public void SetGlow(SceneObjectPart part, int face, float glow) |
1077 | { | 1076 | { |
1078 | Primitive.TextureEntry tex = part.Shape.Textures; | 1077 | Primitive.TextureEntry tex = part.Shape.Textures; |
1079 | if (face > -1) | 1078 | if (face >= 0 && face < GetNumberOfSides(part)) |
1080 | { | 1079 | { |
1081 | tex.CreateFace((uint) face); | 1080 | tex.CreateFace((uint) face); |
1082 | tex.FaceTextures[face].Glow = glow; | 1081 | tex.FaceTextures[face].Glow = glow; |
1083 | part.UpdateTexture(tex); | 1082 | part.UpdateTexture(tex); |
1084 | return; | 1083 | return; |
1085 | } | 1084 | } |
1086 | else if (face == -1) | 1085 | else if (face == ScriptBaseClass.ALL_SIDES) |
1087 | { | 1086 | { |
1088 | for (uint i = 0; i < GetNumberOfSides(part); i++) | 1087 | for (uint i = 0; i < GetNumberOfSides(part); i++) |
1089 | { | 1088 | { |
@@ -1123,7 +1122,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1123 | } | 1122 | } |
1124 | 1123 | ||
1125 | Primitive.TextureEntry tex = part.Shape.Textures; | 1124 | Primitive.TextureEntry tex = part.Shape.Textures; |
1126 | if (face > -1) | 1125 | if (face >= 0 && face < GetNumberOfSides(part)) |
1127 | { | 1126 | { |
1128 | tex.CreateFace((uint) face); | 1127 | tex.CreateFace((uint) face); |
1129 | tex.FaceTextures[face].Shiny = sval; | 1128 | tex.FaceTextures[face].Shiny = sval; |
@@ -1131,9 +1130,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1131 | part.UpdateTexture(tex); | 1130 | part.UpdateTexture(tex); |
1132 | return; | 1131 | return; |
1133 | } | 1132 | } |
1134 | else if (face == -1) | 1133 | else if (face == ScriptBaseClass.ALL_SIDES) |
1135 | { | 1134 | { |
1136 | for (uint i = 0; i < 32; i++) | 1135 | for (uint i = 0; i < GetNumberOfSides(part); i++) |
1137 | { | 1136 | { |
1138 | if (tex.FaceTextures[i] != null) | 1137 | if (tex.FaceTextures[i] != null) |
1139 | { | 1138 | { |
@@ -1151,16 +1150,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1151 | public void SetFullBright(SceneObjectPart part, int face, bool bright) | 1150 | public void SetFullBright(SceneObjectPart part, int face, bool bright) |
1152 | { | 1151 | { |
1153 | Primitive.TextureEntry tex = part.Shape.Textures; | 1152 | Primitive.TextureEntry tex = part.Shape.Textures; |
1154 | if (face > -1) | 1153 | if (face >= 0 && face < GetNumberOfSides(part)) |
1155 | { | 1154 | { |
1156 | tex.CreateFace((uint) face); | 1155 | tex.CreateFace((uint) face); |
1157 | tex.FaceTextures[face].Fullbright = bright; | 1156 | tex.FaceTextures[face].Fullbright = bright; |
1158 | part.UpdateTexture(tex); | 1157 | part.UpdateTexture(tex); |
1159 | return; | 1158 | return; |
1160 | } | 1159 | } |
1161 | else if (face == -1) | 1160 | else if (face == ScriptBaseClass.ALL_SIDES) |
1162 | { | 1161 | { |
1163 | for (uint i = 0; i < 32; i++) | 1162 | for (uint i = 0; i < GetNumberOfSides(part); i++) |
1164 | { | 1163 | { |
1165 | if (tex.FaceTextures[i] != null) | 1164 | if (tex.FaceTextures[i] != null) |
1166 | { | 1165 | { |
@@ -1176,16 +1175,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1176 | public LSL_Types.LSLFloat llGetAlpha(int face) | 1175 | public LSL_Types.LSLFloat llGetAlpha(int face) |
1177 | { | 1176 | { |
1178 | m_host.AddScriptLPS(1); | 1177 | m_host.AddScriptLPS(1); |
1179 | Primitive.TextureEntry tex = m_host.Shape.Textures; | 1178 | |
1180 | if (face == -1) // TMP: Until we can determine number of sides, ALL_SIDES (-1) will return default color | 1179 | return GetAlpha(m_host, face); |
1180 | } | ||
1181 | |||
1182 | private LSL_Types.LSLFloat GetAlpha(SceneObjectPart part, int face) | ||
1183 | { | ||
1184 | Primitive.TextureEntry tex = part.Shape.Textures; | ||
1185 | if (face == ScriptBaseClass.ALL_SIDES) | ||
1181 | { | 1186 | { |
1182 | return (double)((tex.DefaultTexture.RGBA.A * 255) / 255); | 1187 | int i; |
1188 | double sum = 0.0; | ||
1189 | for (i = 0 ; i < GetNumberOfSides(part) ; i++) | ||
1190 | sum += (double)((tex.GetFace((uint)i).RGBA.A * 255) / 255); | ||
1191 | return sum; | ||
1183 | } | 1192 | } |
1184 | if (face > -1) | 1193 | if (face >= 0 && face < GetNumberOfSides(part)) |
1185 | { | 1194 | { |
1186 | return (double)((tex.GetFace((uint)face).RGBA.A * 255) / 255); | 1195 | return (double)((tex.GetFace((uint)face).RGBA.A * 255) / 255); |
1187 | } | 1196 | } |
1188 | return 0; | 1197 | return 0.0; |
1189 | } | 1198 | } |
1190 | 1199 | ||
1191 | public void llSetAlpha(double alpha, int face) | 1200 | public void llSetAlpha(double alpha, int face) |
@@ -1199,7 +1208,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1199 | { | 1208 | { |
1200 | Primitive.TextureEntry tex = part.Shape.Textures; | 1209 | Primitive.TextureEntry tex = part.Shape.Textures; |
1201 | Color4 texcolor; | 1210 | Color4 texcolor; |
1202 | if (face > -1) | 1211 | if (face >= 0 && face < GetNumberOfSides(part)) |
1203 | { | 1212 | { |
1204 | texcolor = tex.CreateFace((uint)face).RGBA; | 1213 | texcolor = tex.CreateFace((uint)face).RGBA; |
1205 | texcolor.A = Util.Clip((float)alpha, 0.0f, 1.0f); | 1214 | texcolor.A = Util.Clip((float)alpha, 0.0f, 1.0f); |
@@ -1207,7 +1216,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1207 | part.UpdateTexture(tex); | 1216 | part.UpdateTexture(tex); |
1208 | return; | 1217 | return; |
1209 | } | 1218 | } |
1210 | else if (face == -1) | 1219 | else if (face == ScriptBaseClass.ALL_SIDES) |
1211 | { | 1220 | { |
1212 | for (int i = 0; i < GetNumberOfSides(part); i++) | 1221 | for (int i = 0; i < GetNumberOfSides(part); i++) |
1213 | { | 1222 | { |
@@ -1325,23 +1334,38 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1325 | public LSL_Types.Vector3 llGetColor(int face) | 1334 | public LSL_Types.Vector3 llGetColor(int face) |
1326 | { | 1335 | { |
1327 | m_host.AddScriptLPS(1); | 1336 | m_host.AddScriptLPS(1); |
1328 | Primitive.TextureEntry tex = m_host.Shape.Textures; | 1337 | return GetColor(m_host, face); |
1338 | } | ||
1339 | |||
1340 | private LSL_Types.Vector3 GetColor(SceneObjectPart part, int face) | ||
1341 | { | ||
1342 | Primitive.TextureEntry tex = part.Shape.Textures; | ||
1329 | Color4 texcolor; | 1343 | Color4 texcolor; |
1330 | LSL_Types.Vector3 rgb; | 1344 | LSL_Types.Vector3 rgb = new LSL_Types.Vector3(); |
1331 | if (face == -1) // TMP: Until we can determine number of sides, ALL_SIDES (-1) will return default color | 1345 | if (face == ScriptBaseClass.ALL_SIDES) |
1332 | { | 1346 | { |
1333 | texcolor = tex.DefaultTexture.RGBA; | 1347 | int i; |
1334 | rgb.x = (255 - (texcolor.R * 255)) / 255; | 1348 | |
1335 | rgb.y = (255 - (texcolor.G * 255)) / 255; | 1349 | for (i = 0 ; i < GetNumberOfSides(part) ; i++) |
1336 | rgb.z = (255 - (texcolor.B * 255)) / 255; | 1350 | { |
1351 | texcolor = tex.GetFace((uint)i).RGBA; | ||
1352 | rgb.x += texcolor.R; | ||
1353 | rgb.y += texcolor.G; | ||
1354 | rgb.z += texcolor.B; | ||
1355 | } | ||
1356 | |||
1357 | rgb.x /= (float)GetNumberOfSides(part); | ||
1358 | rgb.y /= (float)GetNumberOfSides(part); | ||
1359 | rgb.z /= (float)GetNumberOfSides(part); | ||
1360 | |||
1337 | return rgb; | 1361 | return rgb; |
1338 | } | 1362 | } |
1339 | if (face > -1) | 1363 | if (face >= 0 && face < GetNumberOfSides(part)) |
1340 | { | 1364 | { |
1341 | texcolor = tex.GetFace((uint)face).RGBA; | 1365 | texcolor = tex.GetFace((uint)face).RGBA; |
1342 | rgb.x = (255 - (texcolor.R * 255)) / 255; | 1366 | rgb.x = texcolor.R; |
1343 | rgb.y = (255 - (texcolor.G * 255)) / 255; | 1367 | rgb.y = texcolor.G; |
1344 | rgb.z = (255 - (texcolor.B * 255)) / 255; | 1368 | rgb.z = texcolor.B; |
1345 | return rgb; | 1369 | return rgb; |
1346 | } | 1370 | } |
1347 | else | 1371 | else |
@@ -1371,7 +1395,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1371 | 1395 | ||
1372 | Primitive.TextureEntry tex = part.Shape.Textures; | 1396 | Primitive.TextureEntry tex = part.Shape.Textures; |
1373 | 1397 | ||
1374 | if (face > -1) | 1398 | if (face >= 0 && face < GetNumberOfSides(part)) |
1375 | { | 1399 | { |
1376 | Primitive.TextureEntryFace texface = tex.CreateFace((uint)face); | 1400 | Primitive.TextureEntryFace texface = tex.CreateFace((uint)face); |
1377 | texface.TextureID = textureID; | 1401 | texface.TextureID = textureID; |
@@ -1379,9 +1403,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1379 | part.UpdateTexture(tex); | 1403 | part.UpdateTexture(tex); |
1380 | return; | 1404 | return; |
1381 | } | 1405 | } |
1382 | else if (face == -1) | 1406 | else if (face == ScriptBaseClass.ALL_SIDES) |
1383 | { | 1407 | { |
1384 | for (uint i = 0; i < 32; i++) | 1408 | for (uint i = 0; i < GetNumberOfSides(part); i++) |
1385 | { | 1409 | { |
1386 | if (tex.FaceTextures[i] != null) | 1410 | if (tex.FaceTextures[i] != null) |
1387 | { | 1411 | { |
@@ -1405,7 +1429,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1405 | private void ScaleTexture(SceneObjectPart part, double u, double v, int face) | 1429 | private void ScaleTexture(SceneObjectPart part, double u, double v, int face) |
1406 | { | 1430 | { |
1407 | Primitive.TextureEntry tex = part.Shape.Textures; | 1431 | Primitive.TextureEntry tex = part.Shape.Textures; |
1408 | if (face > -1) | 1432 | if (face >= 0 && face < GetNumberOfSides(part)) |
1409 | { | 1433 | { |
1410 | Primitive.TextureEntryFace texface = tex.CreateFace((uint)face); | 1434 | Primitive.TextureEntryFace texface = tex.CreateFace((uint)face); |
1411 | texface.RepeatU = (float)u; | 1435 | texface.RepeatU = (float)u; |
@@ -1414,9 +1438,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1414 | part.UpdateTexture(tex); | 1438 | part.UpdateTexture(tex); |
1415 | return; | 1439 | return; |
1416 | } | 1440 | } |
1417 | if (face == -1) | 1441 | if (face == ScriptBaseClass.ALL_SIDES) |
1418 | { | 1442 | { |
1419 | for (int i = 0; i < 32; i++) | 1443 | for (int i = 0; i < GetNumberOfSides(part); i++) |
1420 | { | 1444 | { |
1421 | if (tex.FaceTextures[i] != null) | 1445 | if (tex.FaceTextures[i] != null) |
1422 | { | 1446 | { |
@@ -1441,7 +1465,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1441 | private void OffsetTexture(SceneObjectPart part, double u, double v, int face) | 1465 | private void OffsetTexture(SceneObjectPart part, double u, double v, int face) |
1442 | { | 1466 | { |
1443 | Primitive.TextureEntry tex = part.Shape.Textures; | 1467 | Primitive.TextureEntry tex = part.Shape.Textures; |
1444 | if (face > -1) | 1468 | if (face >= 0 && face < GetNumberOfSides(part)) |
1445 | { | 1469 | { |
1446 | Primitive.TextureEntryFace texface = tex.CreateFace((uint)face); | 1470 | Primitive.TextureEntryFace texface = tex.CreateFace((uint)face); |
1447 | texface.OffsetU = (float)u; | 1471 | texface.OffsetU = (float)u; |
@@ -1450,9 +1474,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1450 | part.UpdateTexture(tex); | 1474 | part.UpdateTexture(tex); |
1451 | return; | 1475 | return; |
1452 | } | 1476 | } |
1453 | if (face == -1) | 1477 | if (face == ScriptBaseClass.ALL_SIDES) |
1454 | { | 1478 | { |
1455 | for (int i = 0; i < 32; i++) | 1479 | for (int i = 0; i < GetNumberOfSides(part); i++) |
1456 | { | 1480 | { |
1457 | if (tex.FaceTextures[i] != null) | 1481 | if (tex.FaceTextures[i] != null) |
1458 | { | 1482 | { |
@@ -1477,7 +1501,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1477 | private void RotateTexture(SceneObjectPart part, double rotation, int face) | 1501 | private void RotateTexture(SceneObjectPart part, double rotation, int face) |
1478 | { | 1502 | { |
1479 | Primitive.TextureEntry tex = part.Shape.Textures; | 1503 | Primitive.TextureEntry tex = part.Shape.Textures; |
1480 | if (face > -1) | 1504 | if (face >= 0 && face < GetNumberOfSides(part)) |
1481 | { | 1505 | { |
1482 | Primitive.TextureEntryFace texface = tex.CreateFace((uint)face); | 1506 | Primitive.TextureEntryFace texface = tex.CreateFace((uint)face); |
1483 | texface.Rotation = (float)rotation; | 1507 | texface.Rotation = (float)rotation; |
@@ -1485,9 +1509,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1485 | part.UpdateTexture(tex); | 1509 | part.UpdateTexture(tex); |
1486 | return; | 1510 | return; |
1487 | } | 1511 | } |
1488 | if (face == -1) | 1512 | if (face == ScriptBaseClass.ALL_SIDES) |
1489 | { | 1513 | { |
1490 | for (int i = 0; i < 32; i++) | 1514 | for (int i = 0; i < GetNumberOfSides(part); i++) |
1491 | { | 1515 | { |
1492 | if (tex.FaceTextures[i] != null) | 1516 | if (tex.FaceTextures[i] != null) |
1493 | { | 1517 | { |
@@ -1503,12 +1527,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1503 | public LSL_Types.LSLString llGetTexture(int face) | 1527 | public LSL_Types.LSLString llGetTexture(int face) |
1504 | { | 1528 | { |
1505 | m_host.AddScriptLPS(1); | 1529 | m_host.AddScriptLPS(1); |
1506 | Primitive.TextureEntry tex = m_host.Shape.Textures; | 1530 | return GetTexture(m_host, face); |
1507 | if (face == -1) | 1531 | } |
1532 | |||
1533 | private LSL_Types.LSLString GetTexture(SceneObjectPart part, int face) | ||
1534 | { | ||
1535 | Primitive.TextureEntry tex = part.Shape.Textures; | ||
1536 | if (face == ScriptBaseClass.ALL_SIDES) | ||
1508 | { | 1537 | { |
1509 | face = 0; | 1538 | face = 0; |
1510 | } | 1539 | } |
1511 | if (face > -1) | 1540 | if (face >= 0 && face < GetNumberOfSides(part)) |
1512 | { | 1541 | { |
1513 | Primitive.TextureEntryFace texface; | 1542 | Primitive.TextureEntryFace texface; |
1514 | texface = tex.GetFace((uint)face); | 1543 | texface = tex.GetFace((uint)face); |
@@ -3469,7 +3498,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3469 | return GetNumberOfSides(m_host); | 3498 | return GetNumberOfSides(m_host); |
3470 | } | 3499 | } |
3471 | 3500 | ||
3472 | public LSL_Types.LSLInteger GetNumberOfSides(SceneObjectPart part) | 3501 | private int GetNumberOfSides(SceneObjectPart part) |
3473 | { | 3502 | { |
3474 | int ret = 0; | 3503 | int ret = 0; |
3475 | bool hasCut; | 3504 | bool hasCut; |
@@ -3701,16 +3730,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3701 | public LSL_Types.Vector3 llGetTextureOffset(int face) | 3730 | public LSL_Types.Vector3 llGetTextureOffset(int face) |
3702 | { | 3731 | { |
3703 | m_host.AddScriptLPS(1); | 3732 | m_host.AddScriptLPS(1); |
3704 | Primitive.TextureEntry tex = m_host.Shape.Textures; | 3733 | return GetTextureOffset(m_host, face); |
3705 | LSL_Types.Vector3 offset; | 3734 | } |
3706 | if (face == -1) | 3735 | |
3736 | private LSL_Types.Vector3 GetTextureOffset(SceneObjectPart part, int face) | ||
3737 | { | ||
3738 | Primitive.TextureEntry tex = part.Shape.Textures; | ||
3739 | LSL_Types.Vector3 offset = new LSL_Types.Vector3(); | ||
3740 | if (face == ScriptBaseClass.ALL_SIDES) | ||
3707 | { | 3741 | { |
3708 | face = 0; | 3742 | face = 0; |
3709 | } | 3743 | } |
3710 | offset.x = tex.GetFace((uint)face).OffsetU; | 3744 | if(face >= 0 && face < GetNumberOfSides(part)) |
3711 | offset.y = tex.GetFace((uint)face).OffsetV; | 3745 | { |
3712 | offset.z = 0.0; | 3746 | offset.x = tex.GetFace((uint)face).OffsetU; |
3713 | return offset; | 3747 | offset.y = tex.GetFace((uint)face).OffsetV; |
3748 | offset.z = 0.0; | ||
3749 | return offset; | ||
3750 | } | ||
3751 | else | ||
3752 | { | ||
3753 | return offset; | ||
3754 | } | ||
3714 | } | 3755 | } |
3715 | 3756 | ||
3716 | public LSL_Types.Vector3 llGetTextureScale(int side) | 3757 | public LSL_Types.Vector3 llGetTextureScale(int side) |
@@ -3731,12 +3772,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3731 | public LSL_Types.LSLFloat llGetTextureRot(int face) | 3772 | public LSL_Types.LSLFloat llGetTextureRot(int face) |
3732 | { | 3773 | { |
3733 | m_host.AddScriptLPS(1); | 3774 | m_host.AddScriptLPS(1); |
3734 | Primitive.TextureEntry tex = m_host.Shape.Textures; | 3775 | return GetTextureRot(m_host, face); |
3776 | } | ||
3777 | |||
3778 | private LSL_Types.LSLFloat GetTextureRot(SceneObjectPart part, int face) | ||
3779 | { | ||
3780 | Primitive.TextureEntry tex = part.Shape.Textures; | ||
3735 | if (face == -1) | 3781 | if (face == -1) |
3736 | { | 3782 | { |
3737 | face = 0; | 3783 | face = 0; |
3738 | } | 3784 | } |
3739 | return tex.GetFace((uint)face).Rotation; | 3785 | if (face >= 0 && face < GetNumberOfSides(part)) |
3786 | { | ||
3787 | return tex.GetFace((uint)face).Rotation; | ||
3788 | } | ||
3789 | else | ||
3790 | { | ||
3791 | return 0.0; | ||
3792 | } | ||
3740 | } | 3793 | } |
3741 | 3794 | ||
3742 | public LSL_Types.LSLInteger llSubStringIndex(string source, string pattern) | 3795 | public LSL_Types.LSLInteger llSubStringIndex(string source, string pattern) |
@@ -4385,7 +4438,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4385 | pTexAnim.Flags = (Primitive.TextureAnimMode)mode; | 4438 | pTexAnim.Flags = (Primitive.TextureAnimMode)mode; |
4386 | 4439 | ||
4387 | //ALL_SIDES | 4440 | //ALL_SIDES |
4388 | if (face == -1) | 4441 | if (face == ScriptBaseClass.ALL_SIDES) |
4389 | face = 255; | 4442 | face = 255; |
4390 | 4443 | ||
4391 | pTexAnim.Face = (uint)face; | 4444 | pTexAnim.Face = (uint)face; |
@@ -5807,11 +5860,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5807 | case (int)ScriptBaseClass.PRIM_GLOW: | 5860 | case (int)ScriptBaseClass.PRIM_GLOW: |
5808 | if (remain < 2) | 5861 | if (remain < 2) |
5809 | return; | 5862 | return; |
5810 | // TODO: LSL constant ALL_SIDES (value -1) is inserted into LSL_Types.list | 5863 | face = rules.GetLSLIntegerItem(idx++); |
5811 | // as a raw CLI Int32. When / if this is inserted as an | ||
5812 | // LSL_Types.LSLInteger extract value using LSL_Types.list.GetLSLIntegerItem | ||
5813 | // face = rules.GetLSLIntegerItem(idx++); | ||
5814 | face = (int)rules.GetLSLIntegerItem(idx++); | ||
5815 | float glow = (float)rules.GetLSLFloatItem(idx++); | 5864 | float glow = (float)rules.GetLSLFloatItem(idx++); |
5816 | 5865 | ||
5817 | SetGlow(part, face, glow); | 5866 | SetGlow(part, face, glow); |
@@ -5830,11 +5879,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5830 | case (int)ScriptBaseClass.PRIM_FULLBRIGHT: | 5879 | case (int)ScriptBaseClass.PRIM_FULLBRIGHT: |
5831 | if (remain < 2) | 5880 | if (remain < 2) |
5832 | return; | 5881 | return; |
5833 | // TODO: LSL constant ALL_SIDES (value -1) is inserted into LSL_Types.list | 5882 | face = rules.GetLSLIntegerItem(idx++); |
5834 | // as a raw CLI Int32. When / if this is inserted as an | ||
5835 | // LSL_Types.LSLInteger extract value using LSL_Types.list.GetLSLIntegerItem | ||
5836 | // face = rules.GetLSLIntegerItem(idx++); | ||
5837 | face = (int)rules.GetLSLIntegerItem(idx++); | ||
5838 | bool st = rules.GetLSLIntegerItem(idx++); | 5883 | bool st = rules.GetLSLIntegerItem(idx++); |
5839 | SetFullBright(part, face , st); | 5884 | SetFullBright(part, face , st); |
5840 | break; | 5885 | break; |
@@ -6019,7 +6064,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6019 | { | 6064 | { |
6020 | Primitive.TextureEntry tex = part.Shape.Textures; | 6065 | Primitive.TextureEntry tex = part.Shape.Textures; |
6021 | Color4 texcolor; | 6066 | Color4 texcolor; |
6022 | if (face > -1) | 6067 | if (face >= 0 && face < GetNumberOfSides(m_host)) |
6023 | { | 6068 | { |
6024 | texcolor = tex.CreateFace((uint)face).RGBA; | 6069 | texcolor = tex.CreateFace((uint)face).RGBA; |
6025 | texcolor.A = Util.Clip((float)alpha, 0.0f, 1.0f); | 6070 | texcolor.A = Util.Clip((float)alpha, 0.0f, 1.0f); |
@@ -6027,12 +6072,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6027 | part.UpdateTexture(tex); | 6072 | part.UpdateTexture(tex); |
6028 | return; | 6073 | return; |
6029 | } | 6074 | } |
6030 | else if (face == -1) | 6075 | else if (face == ScriptBaseClass.ALL_SIDES) |
6031 | { | 6076 | { |
6032 | texcolor = tex.DefaultTexture.RGBA; | 6077 | texcolor = tex.DefaultTexture.RGBA; |
6033 | texcolor.A = Util.Clip((float)alpha, 0.0f, 1.0f); | 6078 | texcolor.A = Util.Clip((float)alpha, 0.0f, 1.0f); |
6034 | tex.DefaultTexture.RGBA = texcolor; | 6079 | tex.DefaultTexture.RGBA = texcolor; |
6035 | for (uint i = 0; i < 32; i++) | 6080 | for (uint i = 0; i < GetNumberOfSides(m_host); i++) |
6036 | { | 6081 | { |
6037 | if (tex.FaceTextures[i] != null) | 6082 | if (tex.FaceTextures[i] != null) |
6038 | { | 6083 | { |
@@ -6242,7 +6287,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6242 | 6287 | ||
6243 | int face = (int)rules.GetLSLIntegerItem(idx++); | 6288 | int face = (int)rules.GetLSLIntegerItem(idx++); |
6244 | Primitive.TextureEntry tex = m_host.Shape.Textures; | 6289 | Primitive.TextureEntry tex = m_host.Shape.Textures; |
6245 | if (face == -1) // ALL_SIDES | 6290 | if (face == ScriptBaseClass.ALL_SIDES) |
6246 | { | 6291 | { |
6247 | for (face = 0 ; face < GetNumberOfSides(m_host) ; face++) | 6292 | for (face = 0 ; face < GetNumberOfSides(m_host) ; face++) |
6248 | { | 6293 | { |
@@ -6260,16 +6305,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6260 | } | 6305 | } |
6261 | else | 6306 | else |
6262 | { | 6307 | { |
6263 | Primitive.TextureEntryFace texface = tex.GetFace((uint)face); | 6308 | if (face >= 0 && face < GetNumberOfSides(m_host)) |
6264 | 6309 | { | |
6265 | res.Add(new LSL_Types.LSLString(texface.TextureID.ToString())); | 6310 | Primitive.TextureEntryFace texface = tex.GetFace((uint)face); |
6266 | res.Add(new LSL_Types.Vector3(texface.RepeatU, | 6311 | |
6267 | texface.RepeatV, | 6312 | res.Add(new LSL_Types.LSLString(texface.TextureID.ToString())); |
6268 | 0)); | 6313 | res.Add(new LSL_Types.Vector3(texface.RepeatU, |
6269 | res.Add(new LSL_Types.Vector3(texface.OffsetU, | 6314 | texface.RepeatV, |
6270 | texface.OffsetV, | 6315 | 0)); |
6271 | 0)); | 6316 | res.Add(new LSL_Types.Vector3(texface.OffsetU, |
6272 | res.Add(new LSL_Types.LSLFloat(texface.Rotation)); | 6317 | texface.OffsetV, |
6318 | 0)); | ||
6319 | res.Add(new LSL_Types.LSLFloat(texface.Rotation)); | ||
6320 | } | ||
6273 | } | 6321 | } |
6274 | break; | 6322 | break; |
6275 | 6323 | ||
@@ -6281,24 +6329,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6281 | 6329 | ||
6282 | tex = m_host.Shape.Textures; | 6330 | tex = m_host.Shape.Textures; |
6283 | Color4 texcolor; | 6331 | Color4 texcolor; |
6284 | if (face == -1) // ALL_SIDES | 6332 | if (face == ScriptBaseClass.ALL_SIDES) |
6285 | { | 6333 | { |
6286 | for (face = 0 ; face < GetNumberOfSides(m_host) ; face++) | 6334 | for (face = 0 ; face < GetNumberOfSides(m_host) ; face++) |
6287 | { | 6335 | { |
6288 | texcolor = tex.GetFace((uint)face).RGBA; | 6336 | texcolor = tex.GetFace((uint)face).RGBA; |
6289 | res.Add(new LSL_Types.Vector3((255 - (texcolor.R * 255)) / 255, | 6337 | res.Add(new LSL_Types.Vector3(texcolor.R, |
6290 | (255 - (texcolor.G * 255)) / 255, | 6338 | texcolor.G, |
6291 | (255 - (texcolor.B * 255)) / 255)); | 6339 | texcolor.B)); |
6292 | res.Add(new LSL_Types.LSLFloat((texcolor.A * 255) / 255)); | 6340 | res.Add(new LSL_Types.LSLFloat(texcolor.A)); |
6293 | } | 6341 | } |
6294 | } | 6342 | } |
6295 | else | 6343 | else |
6296 | { | 6344 | { |
6297 | texcolor = tex.GetFace((uint)face).RGBA; | 6345 | texcolor = tex.GetFace((uint)face).RGBA; |
6298 | res.Add(new LSL_Types.Vector3((255 - (texcolor.R * 255)) / 255, | 6346 | res.Add(new LSL_Types.Vector3(texcolor.R, |
6299 | (255 - (texcolor.G * 255)) / 255, | 6347 | texcolor.G, |
6300 | (255 - (texcolor.B * 255)) / 255)); | 6348 | texcolor.B)); |
6301 | res.Add(new LSL_Types.LSLFloat((texcolor.A * 255) / 255)); | 6349 | res.Add(new LSL_Types.LSLFloat(texcolor.A)); |
6302 | } | 6350 | } |
6303 | break; | 6351 | break; |
6304 | 6352 | ||