/src/away3d/tools/data/MeshDebug.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 178 lines · 136 code · 39 blank · 3 comment · 5 complexity · 178747980e849099735d892c688046d2 MD5 · raw file

  1. package away3d.tools.data
  2. {
  3. import away3d.core.base.Geometry;
  4. import away3d.core.base.SubGeometry;
  5. import away3d.entities.Mesh;
  6. import away3d.entities.SegmentSet;
  7. import away3d.primitives.LineSegment;
  8. import flash.geom.Vector3D;
  9. /**
  10. * MeshDebug, holds the data for the MeshDebugger class
  11. */
  12. public class MeshDebug extends SegmentSet{
  13. private var _normal : Vector3D = new Vector3D();
  14. private const NORMALS : uint = 0;
  15. private const VERTEXNORMALS : uint = 1;
  16. private const TANGENTS : uint = 2;
  17. public function clearAll():void
  18. {
  19. super.removeAllSegments();
  20. }
  21. public function displayNormals(mesh:Mesh, color:uint = 0xFF3399 , length:Number = 30):void
  22. {
  23. var geometry:Geometry = mesh.geometry;
  24. var geometries:Vector.<SubGeometry> = geometry.subGeometries;
  25. var numSubGeoms:uint = geometries.length;
  26. var vertices:Vector.<Number>;
  27. var indices:Vector.<uint>;
  28. var index:uint;
  29. var indexV:uint;
  30. var j:uint;
  31. var v0 : Vector3D = new Vector3D();
  32. var v1 : Vector3D = new Vector3D();
  33. var v2 : Vector3D = new Vector3D();
  34. var l0 : Vector3D = new Vector3D();
  35. var l1 : Vector3D = new Vector3D();
  36. for (var i:uint = 0; i<numSubGeoms; ++i){
  37. vertices = SubGeometry(geometries[i]).vertexData;
  38. indices = SubGeometry(geometries[i]).indexData;
  39. for (j = 0; j < indices.length; j+=3){
  40. v0.x = vertices[index = indices[j]*3];
  41. v0.y = vertices[index+1];
  42. v0.z = vertices[index+2];
  43. v1.x = vertices[index = indices[j+1]*3];
  44. v1.y = vertices[index+1];
  45. v1.z = vertices[index+2];
  46. v2.x = vertices[index = indices[j+2]*3];
  47. v2.y = vertices[index+1];
  48. v2.z = vertices[index+2];
  49. calcNormal(v0,v1,v2);
  50. l0.x = (v0.x + v1.x + v2.x)/3;
  51. l0.y = (v0.y + v1.y + v2.y)/3;
  52. l0.z = (v0.z + v1.z + v2.z)/3;
  53. l1.x = l0.x + (_normal.x*length);
  54. l1.y = l0.y + (_normal.y*length);
  55. l1.z = l0.z + (_normal.z*length);
  56. addSegment(new LineSegment(l0, l1, color, color, 1 ));
  57. }
  58. }
  59. }
  60. public function displayVertexNormals(mesh:Mesh, color:uint = 0x66CCFF, length:Number = 30):void
  61. {
  62. build(mesh, VERTEXNORMALS , color, length);
  63. }
  64. public function displayTangents(mesh:Mesh, color:uint = 0xFFCC00, length:Number = 30):void
  65. {
  66. build(mesh, TANGENTS, color, length);
  67. }
  68. private function build(mesh:Mesh, type:uint, color:uint = 0x66CCFF, length:Number = 30):void
  69. {
  70. var geometry:Geometry = mesh.geometry;
  71. var geometries:Vector.<SubGeometry> = geometry.subGeometries;
  72. var numSubGeoms:uint = geometries.length;
  73. var vertices:Vector.<Number>;
  74. var vertorTarget:Vector.<Number>;
  75. var tangents:Vector.<Number>;
  76. var indices:Vector.<uint>;
  77. var index:uint;
  78. var indexV:uint;
  79. var j:uint;
  80. var v0 : Vector3D = new Vector3D();
  81. var v1 : Vector3D = new Vector3D();
  82. var v2 : Vector3D = new Vector3D();
  83. var l0 : Vector3D = new Vector3D();
  84. for (var i:uint = 0; i<numSubGeoms; ++i){
  85. vertices = SubGeometry(geometries[i]).vertexData;
  86. vertorTarget = (type == 1)? SubGeometry(geometries[i]).vertexNormalData : SubGeometry(geometries[i]).vertexTangentData;
  87. indices = SubGeometry(geometries[i]).indexData;
  88. for (j = 0; j < indices.length; j+=3){
  89. v0.x = vertices[index = indices[j]*3];
  90. _normal.x = vertorTarget[index];
  91. v0.y = vertices[index+1];
  92. _normal.y = vertorTarget[index+1];
  93. v0.z = vertices[index+2];
  94. _normal.z = vertorTarget[index+2];
  95. l0.x = v0.x + (_normal.x*length);
  96. l0.y = v0.y + (_normal.y*length);
  97. l0.z = v0.z + (_normal.z*length);
  98. addSegment(new LineSegment(v0, l0, color, color, 1 ));
  99. v1.x = vertices[index = indices[j+1]*3];
  100. _normal.x = vertorTarget[index];
  101. v1.y = vertices[index+1];
  102. _normal.y = vertorTarget[index+1];
  103. v1.z = vertices[index+2];
  104. _normal.z = vertorTarget[index+2];
  105. l0.x = v1.x + (_normal.x*length);
  106. l0.y = v1.y + (_normal.y*length);
  107. l0.z = v1.z + (_normal.z*length);
  108. addSegment(new LineSegment(v1, l0, color, color, 1 ));
  109. v2.x = vertices[index = indices[j+2]*3];
  110. _normal.x = vertorTarget[index];
  111. v2.y = vertices[index+1];
  112. _normal.y = vertorTarget[index+1];
  113. v2.z = vertices[index+2];
  114. _normal.z = vertorTarget[index+2];
  115. l0.x = v2.x + (_normal.x*length);
  116. l0.y = v2.y + (_normal.y*length);
  117. l0.z = v2.z + (_normal.z*length);
  118. addSegment(new LineSegment(v2, l0, color, color, 1 ));
  119. }
  120. }
  121. }
  122. private function calcNormal(v0:Vector3D,v1:Vector3D,v2:Vector3D):void
  123. {
  124. var dx1:Number = v2.x-v0.x;
  125. var dy1:Number = v2.y-v0.y;
  126. var dz1:Number = v2.z-v0.z;
  127. var dx2:Number = v1.x-v0.x;
  128. var dy2:Number = v1.y-v0.y;
  129. var dz2:Number = v1.z-v0.z;
  130. var cx:Number = dz1*dy2 - dy1*dz2;
  131. var cy:Number = dx1*dz2 - dz1*dx2;
  132. var cz:Number = dy1*dx2 - dx1*dy2;
  133. var d:Number = 1/Math.sqrt(cx*cx+cy*cy+cz*cz);
  134. _normal.x = cx*d;
  135. _normal.y = cy*d;
  136. _normal.z = cz*d;
  137. }
  138. }
  139. }