diff options
Diffstat (limited to 'OpenSim/Framework')
-rw-r--r-- | OpenSim/Framework/PrimitiveBaseShape.cs | 358 |
1 files changed, 357 insertions, 1 deletions
diff --git a/OpenSim/Framework/PrimitiveBaseShape.cs b/OpenSim/Framework/PrimitiveBaseShape.cs index 6607c4b..aabd69d 100644 --- a/OpenSim/Framework/PrimitiveBaseShape.cs +++ b/OpenSim/Framework/PrimitiveBaseShape.cs | |||
@@ -71,7 +71,7 @@ namespace OpenSim.Framework | |||
71 | public class PrimitiveBaseShape | 71 | public class PrimitiveBaseShape |
72 | { | 72 | { |
73 | private static readonly LLObject.TextureEntry m_defaultTexture; | 73 | private static readonly LLObject.TextureEntry m_defaultTexture; |
74 | public byte[] ExtraParams; | 74 | |
75 | private byte[] m_textureEntry; | 75 | private byte[] m_textureEntry; |
76 | 76 | ||
77 | public ushort PathBegin; | 77 | public ushort PathBegin; |
@@ -97,6 +97,33 @@ namespace OpenSim.Framework | |||
97 | public ushort ProfileHollow; | 97 | public ushort ProfileHollow; |
98 | public LLVector3 Scale; | 98 | public LLVector3 Scale; |
99 | public byte State; | 99 | public byte State; |
100 | // Sculpted | ||
101 | [XmlIgnore] public LLUUID SculptTexture = LLUUID.Zero; | ||
102 | [XmlIgnore] public byte SculptType = (byte)0; | ||
103 | |||
104 | // Flexi | ||
105 | [XmlIgnore] public int FlexiSoftness = 0; | ||
106 | [XmlIgnore] public float FlexiTension = 0f; | ||
107 | [XmlIgnore] public float FlexiDrag = 0f; | ||
108 | [XmlIgnore] public float FlexiGravity = 0f; | ||
109 | [XmlIgnore] public float FlexiWind= 0f; | ||
110 | [XmlIgnore] public float FlexiForceX = 0f; | ||
111 | [XmlIgnore] public float FlexiForceY = 0f; | ||
112 | [XmlIgnore] public float FlexiForceZ = 0f; | ||
113 | |||
114 | //Bright n sparkly | ||
115 | [XmlIgnore] public float LightColorR = 0f; | ||
116 | [XmlIgnore] public float LightColorG = 0f; | ||
117 | [XmlIgnore] public float LightColorB = 0f; | ||
118 | [XmlIgnore] public float LightColorA = 1f; | ||
119 | [XmlIgnore] public float LightRadius = 0f; | ||
120 | [XmlIgnore] public float LightCutoff = 0f; | ||
121 | [XmlIgnore] public float LightFalloff = 0f; | ||
122 | [XmlIgnore] public float LightIntensity = 1f; | ||
123 | [XmlIgnore] public bool FlexiEntry = false; | ||
124 | [XmlIgnore] public bool LightEntry = false; | ||
125 | [XmlIgnore] public bool SculptEntry = false; | ||
126 | |||
100 | 127 | ||
101 | static PrimitiveBaseShape() | 128 | static PrimitiveBaseShape() |
102 | { | 129 | { |
@@ -231,10 +258,339 @@ namespace OpenSim.Framework | |||
231 | PathEnd = LLObject.PackEndCut(pathRange.Y); | 258 | PathEnd = LLObject.PackEndCut(pathRange.Y); |
232 | } | 259 | } |
233 | 260 | ||
261 | public void SetSculptData(byte sculptType, LLUUID SculptTextureUUID) | ||
262 | { | ||
263 | SculptType = sculptType; | ||
264 | SculptTexture = SculptTextureUUID; | ||
265 | } | ||
266 | |||
234 | public void SetProfileRange(LLVector3 profileRange) | 267 | public void SetProfileRange(LLVector3 profileRange) |
235 | { | 268 | { |
236 | ProfileBegin = LLObject.PackBeginCut(profileRange.X); | 269 | ProfileBegin = LLObject.PackBeginCut(profileRange.X); |
237 | ProfileEnd = LLObject.PackEndCut(profileRange.Y); | 270 | ProfileEnd = LLObject.PackEndCut(profileRange.Y); |
238 | } | 271 | } |
272 | public byte[] ExtraParams | ||
273 | { | ||
274 | get | ||
275 | { | ||
276 | return ExtraParamsToBytes(); | ||
277 | } | ||
278 | set | ||
279 | { | ||
280 | ReadInExtraParamsBytes(value); | ||
281 | } | ||
282 | } | ||
283 | |||
284 | public byte[] ExtraParamsToBytes() | ||
285 | { | ||
286 | ushort FlexiEP = 0x10; | ||
287 | ushort LightEP = 0x20; | ||
288 | ushort SculptEP = 0x30; | ||
289 | |||
290 | int i = 0; | ||
291 | uint TotalBytesLength = 5; | ||
292 | |||
293 | uint ExtraParamsNum = 0; | ||
294 | if (FlexiEntry) | ||
295 | { | ||
296 | ExtraParamsNum++; | ||
297 | TotalBytesLength += 16;// data | ||
298 | TotalBytesLength += 4; // type | ||
299 | } | ||
300 | if (LightEntry) | ||
301 | { | ||
302 | ExtraParamsNum++; | ||
303 | TotalBytesLength += 16;// data | ||
304 | TotalBytesLength += 4; // type | ||
305 | } | ||
306 | if (SculptEntry) | ||
307 | { | ||
308 | ExtraParamsNum++; | ||
309 | TotalBytesLength += 17;// data | ||
310 | TotalBytesLength += 4; // type | ||
311 | } | ||
312 | |||
313 | byte[] returnbytes = new byte[TotalBytesLength]; | ||
314 | |||
315 | |||
316 | uint paramlength = ExtraParamsNum; | ||
317 | |||
318 | // Stick in the number of parameters | ||
319 | returnbytes[i++] = (byte)ExtraParamsNum; | ||
320 | |||
321 | if (FlexiEntry) | ||
322 | { | ||
323 | byte[] FlexiData = GetFlexiBytes(); | ||
324 | |||
325 | returnbytes[i++] = (byte)(FlexiEP % 256); | ||
326 | returnbytes[i++] = (byte)((FlexiEP >> 8) % 256); | ||
327 | |||
328 | returnbytes[i++] = (byte)(FlexiData.Length % 256); | ||
329 | returnbytes[i++] = (byte)((FlexiData.Length >> 8) % 256); | ||
330 | returnbytes[i++] = (byte)((FlexiData.Length >> 16) % 256); | ||
331 | returnbytes[i++] = (byte)((FlexiData.Length >> 24) % 256); | ||
332 | Array.Copy(FlexiData, 0, returnbytes, i, FlexiData.Length); | ||
333 | i += FlexiData.Length; | ||
334 | } | ||
335 | if (LightEntry) | ||
336 | { | ||
337 | byte[] LightData = GetLightBytes(); | ||
338 | |||
339 | returnbytes[i++] = (byte)(LightEP % 256); | ||
340 | returnbytes[i++] = (byte)((LightEP >> 8) % 256); | ||
341 | |||
342 | returnbytes[i++] = (byte)(LightData.Length % 256); | ||
343 | returnbytes[i++] = (byte)((LightData.Length >> 8) % 256); | ||
344 | returnbytes[i++] = (byte)((LightData.Length >> 16) % 256); | ||
345 | returnbytes[i++] = (byte)((LightData.Length >> 24) % 256); | ||
346 | Array.Copy(LightData, 0, returnbytes, i, LightData.Length); | ||
347 | i += LightData.Length; | ||
348 | } | ||
349 | if (SculptEntry) | ||
350 | { | ||
351 | byte[] SculptData = GetSculptBytes(); | ||
352 | |||
353 | returnbytes[i++] = (byte)(SculptEP % 256); | ||
354 | returnbytes[i++] = (byte)((SculptEP >> 8) % 256); | ||
355 | |||
356 | returnbytes[i++] = (byte)(SculptData.Length % 256); | ||
357 | returnbytes[i++] = (byte)((SculptData.Length >> 8) % 256); | ||
358 | returnbytes[i++] = (byte)((SculptData.Length >> 16) % 256); | ||
359 | returnbytes[i++] = (byte)((SculptData.Length >> 24) % 256); | ||
360 | Array.Copy(SculptData, 0, returnbytes, i, SculptData.Length); | ||
361 | i += SculptData.Length; | ||
362 | } | ||
363 | |||
364 | if (!FlexiEntry && !LightEntry && !SculptEntry) | ||
365 | { | ||
366 | byte[] returnbyte = new byte[1]; | ||
367 | returnbyte[0] = 0; | ||
368 | return returnbyte; | ||
369 | } | ||
370 | |||
371 | |||
372 | return returnbytes; | ||
373 | //m_log.Info("[EXTRAPARAMS]: Length = " + m_shape.ExtraParams.Length.ToString()); | ||
374 | |||
375 | } | ||
376 | |||
377 | public void ReadInUpdateExtraParam(ushort type, bool inUse, byte[] data) | ||
378 | { | ||
379 | const ushort FlexiEP = 0x10; | ||
380 | const ushort LightEP = 0x20; | ||
381 | const ushort SculptEP = 0x30; | ||
382 | |||
383 | switch (type) | ||
384 | { | ||
385 | case FlexiEP: | ||
386 | if (!inUse) | ||
387 | { | ||
388 | FlexiEntry = false; | ||
389 | return; | ||
390 | } | ||
391 | ReadFlexiData(data, 0); | ||
392 | break; | ||
393 | |||
394 | case LightEP: | ||
395 | if (!inUse) | ||
396 | { | ||
397 | LightEntry = false; | ||
398 | return; | ||
399 | } | ||
400 | ReadLightData(data, 0); | ||
401 | break; | ||
402 | |||
403 | case SculptEP: | ||
404 | if (!inUse) | ||
405 | { | ||
406 | SculptEntry = false; | ||
407 | return; | ||
408 | } | ||
409 | ReadSculptData(data, 0); | ||
410 | break; | ||
411 | } | ||
412 | } | ||
413 | |||
414 | public void ReadInExtraParamsBytes(byte[] data) | ||
415 | { | ||
416 | const ushort FlexiEP = 0x10; | ||
417 | const ushort LightEP = 0x20; | ||
418 | const ushort SculptEP = 0x30; | ||
419 | |||
420 | bool lGotFlexi = false; | ||
421 | bool lGotLight = false; | ||
422 | bool lGotSculpt = false; | ||
423 | |||
424 | int i = 0; | ||
425 | int totalLength = 1; | ||
426 | byte extraParamCount = data[i++]; | ||
427 | |||
428 | if (extraParamCount > 0) | ||
429 | { | ||
430 | int foo = 0; | ||
431 | } | ||
432 | for (int k = 0; k < extraParamCount; k++) | ||
433 | { | ||
434 | ushort epType = Helpers.BytesToUInt16(data, i); | ||
435 | |||
436 | i += 2; | ||
437 | uint paramLength = Helpers.BytesToUIntBig(data, i); | ||
438 | |||
439 | i += 4; | ||
440 | switch (epType) | ||
441 | { | ||
442 | case FlexiEP: | ||
443 | ReadFlexiData(data, i); | ||
444 | lGotFlexi = true; | ||
445 | break; | ||
446 | |||
447 | case LightEP: | ||
448 | ReadLightData(data, i); | ||
449 | lGotLight = true; | ||
450 | break; | ||
451 | |||
452 | case SculptEP: | ||
453 | ReadSculptData(data, i); | ||
454 | lGotSculpt = true; | ||
455 | break; | ||
456 | } | ||
457 | } | ||
458 | |||
459 | if (!lGotFlexi) | ||
460 | FlexiEntry = false; | ||
461 | if (!lGotLight) | ||
462 | LightEntry = false; | ||
463 | if (!lGotSculpt) | ||
464 | SculptEntry = false; | ||
465 | |||
466 | } | ||
467 | |||
468 | public void ReadSculptData(byte[] data, int pos) | ||
469 | { | ||
470 | byte[] SculptTextureUUID = new byte[16]; | ||
471 | LLUUID SculptUUID = LLUUID.Zero; | ||
472 | byte SculptTypel = data[16+pos]; | ||
473 | |||
474 | if (data.Length+pos >= 17) | ||
475 | { | ||
476 | SculptEntry = true; | ||
477 | SculptTextureUUID = new byte[16]; | ||
478 | SculptTypel = data[16]; | ||
479 | Array.Copy(data, pos, SculptTextureUUID,0, 16); | ||
480 | SculptUUID = new LLUUID(SculptTextureUUID, 0); | ||
481 | } | ||
482 | else | ||
483 | { | ||
484 | SculptEntry = false; | ||
485 | SculptUUID = LLUUID.Zero; | ||
486 | SculptTypel = 0x00; | ||
487 | } | ||
488 | |||
489 | |||
490 | SculptTexture = SculptUUID; | ||
491 | SculptType = SculptTypel; | ||
492 | //m_log.Info("[SCULPT]:" + SculptUUID.ToString()); | ||
493 | } | ||
494 | |||
495 | public byte[] GetSculptBytes() | ||
496 | { | ||
497 | byte[] data = new byte[17]; | ||
498 | |||
499 | SculptTexture.GetBytes().CopyTo(data, 0); | ||
500 | data[16] = (byte)SculptType; | ||
501 | |||
502 | return data; | ||
503 | } | ||
504 | public void ReadFlexiData(byte[] data, int pos) | ||
505 | { | ||
506 | if (data.Length-pos >= 5) | ||
507 | { | ||
508 | FlexiEntry = true; | ||
509 | FlexiSoftness = ((data[pos] & 0x80) >> 6) | ((data[pos + 1] & 0x80) >> 7); | ||
510 | |||
511 | FlexiTension = (float)(data[pos++] & 0x7F) / 10.0f; | ||
512 | FlexiDrag = (float)(data[pos++] & 0x7F) / 10.0f; | ||
513 | FlexiGravity = (float)(data[pos++] / 10.0f) - 10.0f; | ||
514 | FlexiWind = (float)data[pos++] / 10.0f; | ||
515 | LLVector3 lForce = new LLVector3(data, pos); | ||
516 | FlexiForceX = lForce.X; | ||
517 | FlexiForceY = lForce.Y; | ||
518 | FlexiForceZ = lForce.Z; | ||
519 | } | ||
520 | else | ||
521 | { | ||
522 | FlexiEntry = false; | ||
523 | FlexiSoftness = 0; | ||
524 | |||
525 | FlexiTension = 0.0f; | ||
526 | FlexiDrag = 0.0f; | ||
527 | FlexiGravity = 0.0f; | ||
528 | FlexiWind = 0.0f; | ||
529 | FlexiForceX = 0f; | ||
530 | FlexiForceY = 0f; | ||
531 | FlexiForceZ = 0f; | ||
532 | } | ||
533 | } | ||
534 | public byte[] GetFlexiBytes() | ||
535 | { | ||
536 | byte[] data = new byte[16]; | ||
537 | int i = 0; | ||
538 | |||
539 | // Softness is packed in the upper bits of tension and drag | ||
540 | data[i] = (byte)((FlexiSoftness & 2) << 6); | ||
541 | data[i + 1] = (byte)((FlexiSoftness & 1) << 7); | ||
542 | |||
543 | data[i++] |= (byte)((byte)(FlexiTension * 10.01f) & 0x7F); | ||
544 | data[i++] |= (byte)((byte)(FlexiDrag * 10.01f) & 0x7F); | ||
545 | data[i++] = (byte)((FlexiGravity + 10.0f) * 10.01f); | ||
546 | data[i++] = (byte)(FlexiWind * 10.01f); | ||
547 | LLVector3 lForce = new LLVector3(FlexiForceX, FlexiForceY, FlexiForceZ); | ||
548 | lForce.GetBytes().CopyTo(data, i); | ||
549 | |||
550 | return data; | ||
551 | } | ||
552 | public void ReadLightData(byte[] data, int pos) | ||
553 | { | ||
554 | if (data.Length - pos >= 16) | ||
555 | { | ||
556 | LightEntry = true; | ||
557 | LLColor lColor = new LLColor(data, pos, false); | ||
558 | LightIntensity = lColor.A; | ||
559 | LightColorA = 1f; | ||
560 | LightColorR = lColor.R; | ||
561 | LightColorG = lColor.G; | ||
562 | LightColorB = lColor.B; | ||
563 | |||
564 | LightRadius = Helpers.BytesToFloat(data, pos + 4); | ||
565 | LightCutoff = Helpers.BytesToFloat(data, pos + 8); | ||
566 | LightFalloff = Helpers.BytesToFloat(data, pos + 12); | ||
567 | } | ||
568 | else | ||
569 | { | ||
570 | LightEntry = false; | ||
571 | LightColorA = 1f; | ||
572 | LightColorR = 0f; | ||
573 | LightColorG = 0f; | ||
574 | LightColorB = 0f; | ||
575 | LightRadius = 0f; | ||
576 | LightCutoff = 0f; | ||
577 | LightFalloff = 0f; | ||
578 | LightIntensity = 0f; | ||
579 | } | ||
580 | } | ||
581 | public byte[] GetLightBytes() | ||
582 | { | ||
583 | byte[] data = new byte[16]; | ||
584 | |||
585 | // Alpha channel in color is intensity | ||
586 | LLColor tmpColor = new LLColor(LightColorR,LightColorG,LightColorB,LightIntensity); | ||
587 | |||
588 | tmpColor.GetBytes().CopyTo(data, 0); | ||
589 | Helpers.FloatToBytes(LightRadius).CopyTo(data, 4); | ||
590 | Helpers.FloatToBytes(LightCutoff).CopyTo(data, 8); | ||
591 | Helpers.FloatToBytes(LightFalloff).CopyTo(data, 12); | ||
592 | |||
593 | return data; | ||
594 | } | ||
239 | } | 595 | } |
240 | } \ No newline at end of file | 596 | } \ No newline at end of file |