Interactive.hx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. //PARAM=-D resourcesPath=../../skin_res
  2. class Interactive extends SampleApp {
  3. var interactives : Array<h3d.scene.Interactive> = [];
  4. var showDebug = false;
  5. var rnd : hxd.Rand;
  6. var light : h3d.scene.fwd.DirLight;
  7. var obj : h3d.scene.Object;
  8. var b : h2d.Interactive;
  9. function initInteract( i : h3d.scene.Interactive, m : h3d.scene.Mesh ) {
  10. var beacon = null;
  11. var color = m.material.color.clone();
  12. i.bestMatch = true;
  13. i.onOver = function(e : hxd.Event) {
  14. m.material.color.set(0, 1, 0);
  15. var s = new h3d.prim.Sphere(1, 32, 32);
  16. s.addNormals();
  17. beacon = new h3d.scene.Mesh(s, s3d);
  18. beacon.material.mainPass.enableLights = true;
  19. beacon.material.color.set(1, 0, 0);
  20. beacon.scale(0.01);
  21. beacon.x = e.relX;
  22. beacon.y = e.relY;
  23. beacon.z = e.relZ;
  24. };
  25. i.onMove = i.onCheck = function(e:hxd.Event) {
  26. if( beacon == null ) return;
  27. beacon.x = e.relX;
  28. beacon.y = e.relY;
  29. beacon.z = e.relZ;
  30. };
  31. i.onOut = function(e : hxd.Event) {
  32. m.material.color.load(color);
  33. beacon.remove();
  34. beacon = null;
  35. };
  36. interactives.push(i);
  37. if( showDebug )
  38. i.showDebug = showDebug;
  39. }
  40. override function init() {
  41. super.init();
  42. light = new h3d.scene.fwd.DirLight(new h3d.Vector( 0.3, -0.4, -0.9), s3d);
  43. light.enableSpecular = true;
  44. light.color.set(0.28, 0.28, 0.28);
  45. cast(s3d.lightSystem,h3d.scene.fwd.LightSystem).ambientLight.set(0.74, 0.74, 0.74);
  46. rnd = new hxd.Rand(5);
  47. for(i in 0...8) {
  48. var c = if( rnd.random(2) == 0 ) new h3d.prim.Cube() else new h3d.prim.Sphere(1, 30, 20);
  49. //c.unindex();
  50. c.addNormals();
  51. c.addUVs();
  52. var m = new h3d.scene.Mesh(c, s3d);
  53. m.x = rnd.srand() * 0.9;
  54. m.y = rnd.srand() * 0.9;
  55. m.scale(0.25 + rnd.rand() * 0.3);
  56. if( i & 1 == 0 )
  57. m.rotate(0.25, 0.5, 0.8);
  58. m.material.mainPass.enableLights = true;
  59. m.material.shadows = true;
  60. var c = 0.3 + rnd.rand() * 0.3;
  61. var color = new h3d.Vector(c, c * 0.6, c * 0.6);
  62. m.material.color.load(color);
  63. var interact = new h3d.scene.Interactive(m.getCollider(), s3d);
  64. initInteract(interact, m);
  65. }
  66. // A cylinder with a capsule collider
  67. {
  68. var cradius = 0.5;
  69. var cheight = 1;
  70. var c = new h3d.prim.Cylinder(20, cradius, cheight);
  71. //c.unindex();
  72. c.addNormals();
  73. c.addUVs();
  74. var m = new h3d.scene.Mesh(c, s3d);
  75. m.y = 1.2;
  76. m.scale(0.25 + rnd.rand() * 0.3);
  77. m.rotate(-0.25, -0.5, -0.8);
  78. m.material.mainPass.enableLights = true;
  79. m.material.shadows = true;
  80. var c = 0.3 + rnd.rand() * 0.3;
  81. var color = new h3d.Vector(c, c * 0.6, c * 0.6);
  82. m.material.color.load(color);
  83. var p1 = new h3d.col.Point(0, 0, cheight);
  84. var p2 = new h3d.col.Point(0, 0, 0);
  85. var col = new h3d.col.Capsule(p1, p2, cradius);
  86. var interact = new h3d.scene.Interactive(new h3d.col.ObjectCollider(m, col), s3d);
  87. initInteract(interact, m);
  88. }
  89. // A sphere with bounds (box/square collider)
  90. {
  91. var c = new h3d.prim.Sphere(0.5, 15, 10);
  92. //c.unindex();
  93. c.addNormals();
  94. c.addUVs();
  95. var m = new h3d.scene.Mesh(c, s3d);
  96. m.x = 0.3;
  97. m.y = -1.2;
  98. m.material.mainPass.enableLights = true;
  99. m.material.shadows = true;
  100. var c = 0.3 + rnd.rand() * 0.3;
  101. var color = new h3d.Vector(c, c * 0.6, c * 0.6);
  102. m.material.color.load(color);
  103. var col = m.getBounds();
  104. var interact = new h3d.scene.Interactive(col, s3d);
  105. initInteract(interact, m);
  106. }
  107. var cache = new h3d.prim.ModelCache();
  108. obj = cache.loadModel(hxd.Res.Model);
  109. obj.scale(1 / 20);
  110. obj.rotate(0,0,Math.PI / 2);
  111. obj.y = 0.2;
  112. obj.z = 0.2;
  113. s3d.addChild(obj);
  114. obj.playAnimation(cache.loadAnimation(hxd.Res.Model)).speed = 0.1;
  115. for( o in obj ) {
  116. var m = o.toMesh();
  117. var i = new h3d.scene.Interactive(m.getCollider(), s3d);
  118. initInteract(i, m);
  119. }
  120. b = new h2d.Interactive(150, 100, s2d);
  121. b.backgroundColor = 0x80204060;
  122. b.rotation = Math.PI / 3;
  123. //b.scaleX = 1.5; // TODO
  124. var pix = null;
  125. b.onOver = function(e) {
  126. var t = h2d.Tile.fromColor(0xFF0000, 3, 3);
  127. t.dx = -1;
  128. t.dy = -1;
  129. pix = new h2d.Bitmap(t, b);
  130. pix.x = e.relX;
  131. pix.y = e.relY;
  132. };
  133. b.onMove = function(e) {
  134. if( pix == null ) return;
  135. pix.x = e.relX;
  136. pix.y = e.relY;
  137. }
  138. b.onOut = function(e) {
  139. pix.remove();
  140. pix = null;
  141. };
  142. addCheck("Show Debug Colliders", function() { return showDebug; }, function(v) { setDebug(v); });
  143. new h3d.scene.CameraController(s3d).loadFromCamera();
  144. onResize();
  145. }
  146. function setDebug(showDebug) {
  147. this.showDebug = showDebug;
  148. for( i in interactives )
  149. i.showDebug = showDebug;
  150. }
  151. override function onResize() {
  152. b.x = (s2d.width >> 1) - 200;
  153. b.y = 150;
  154. }
  155. override function update(dt:Float) {
  156. obj.rotate(0, 0, 0.12 * dt);
  157. }
  158. static function main() {
  159. hxd.Res.initEmbed();
  160. new Interactive();
  161. }
  162. }