Prefab.hx 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. package hide.view;
  2. import hide.view.CameraController.CamController;
  3. using Lambda;
  4. import hxd.Math;
  5. import hxd.Key as K;
  6. import hrt.prefab.Prefab as PrefabElement;
  7. import hrt.prefab.Object3D;
  8. import hrt.prefab.l3d.Instance;
  9. import hide.comp.cdb.DataFiles;
  10. @:access(hide.view.Prefab)
  11. private class PrefabSceneEditor extends hide.comp.SceneEditor {
  12. var parent : Prefab;
  13. public function new(view, data) {
  14. super(view, data);
  15. parent = cast view;
  16. this.localTransform = false; // TODO: Expose option
  17. }
  18. override function refresh(?mode, ?callback) {
  19. parent.onRefresh();
  20. super.refresh(mode, callback);
  21. }
  22. override function update(dt) {
  23. super.update(dt);
  24. parent.onUpdate(dt);
  25. }
  26. override function onSceneReady() {
  27. super.onSceneReady();
  28. parent.onSceneReady();
  29. }
  30. override function applyTreeStyle(p: PrefabElement, el: Element, ?pname: String) {
  31. super.applyTreeStyle(p, el, pname);
  32. parent.applyTreeStyle(p, el, pname);
  33. }
  34. override function applySceneStyle(p:PrefabElement) {
  35. parent.applySceneStyle(p);
  36. }
  37. override function onPrefabChange(p: PrefabElement, ?pname: String) {
  38. super.onPrefabChange(p, pname);
  39. parent.onPrefabChange(p, pname);
  40. }
  41. override function getNewContextMenu(current: PrefabElement, ?onMake: PrefabElement->Void=null, ?groupByType = true ) {
  42. var newItems = super.getNewContextMenu(current, onMake, groupByType);
  43. var recents = getNewRecentContextMenu(current, onMake);
  44. function setup(p : PrefabElement) {
  45. autoName(p);
  46. haxe.Timer.delay(addElements.bind([p]), 0);
  47. }
  48. function addNewInstances() {
  49. var items = new Array<hide.comp.ContextMenu.ContextMenuItem>();
  50. for(type in DataFiles.getAvailableTypes() ) {
  51. var typeId = DataFiles.getTypeName(type);
  52. var label = typeId.charAt(0).toUpperCase() + typeId.substr(1);
  53. var refCols = Instance.findRefColumns(type);
  54. var refSheet = refCols == null ? null : type.base.getSheet(refCols.sheet);
  55. var idCol = refCols == null ? null : Instance.findIDColumn(refSheet);
  56. function make(name) {
  57. var p = new Instance(current == null ? sceneData : current);
  58. p.name = name;
  59. p.props = makeCdbProps(p, type);
  60. setup(p);
  61. if(onMake != null)
  62. onMake(p);
  63. return p;
  64. }
  65. if(idCol != null && refSheet.props.dataFiles == null ) {
  66. var kindItems = new Array<hide.comp.ContextMenu.ContextMenuItem>();
  67. for(line in refSheet.lines) {
  68. var kind : String = Reflect.getProperty(line, idCol.name);
  69. kindItems.push({
  70. label : kind,
  71. click : function() {
  72. var p = make(kind.charAt(0).toLowerCase() + kind.substr(1));
  73. var obj : Dynamic = p.props;
  74. for( c in refCols.cols ) {
  75. if( c == refCols.cols[refCols.cols.length-1] )
  76. Reflect.setField(obj, c.name, kind);
  77. else {
  78. var s = Reflect.field(obj,c.name);
  79. if( s == null ) {
  80. s = {};
  81. Reflect.setField(obj, c.name, s);
  82. }
  83. obj = s;
  84. }
  85. }
  86. }
  87. });
  88. }
  89. items.unshift({
  90. label : label,
  91. menu: kindItems
  92. });
  93. }
  94. else {
  95. items.push({
  96. label : label,
  97. click : make.bind(typeId)
  98. });
  99. }
  100. }
  101. newItems.unshift({
  102. label : "Instance",
  103. menu: items
  104. });
  105. };
  106. addNewInstances();
  107. newItems.unshift({
  108. label : "Recents",
  109. menu : recents,
  110. });
  111. return newItems;
  112. }
  113. override function getAvailableTags(p:PrefabElement) {
  114. return cast ide.currentConfig.get("sceneeditor.tags");
  115. }
  116. }
  117. class Prefab extends FileView {
  118. public var sceneEditor : PrefabSceneEditor;
  119. var data : hrt.prefab.Library;
  120. var tools : hide.comp.Toolbar;
  121. var layerToolbar : hide.comp.Toolbar;
  122. var layerButtons : Map<PrefabElement, hide.comp.Toolbar.ToolToggle>;
  123. var resizablePanel : hide.comp.ResizablePanel;
  124. var grid : h3d.scene.Graphics;
  125. var gridStep : Int;
  126. var gridSize : Int;
  127. var showGrid = false;
  128. // autoSync
  129. var autoSync : Bool;
  130. var currentVersion : Int = 0;
  131. var lastSyncChange : Float = 0.;
  132. var sceneFilters : Map<String, Bool>;
  133. var graphicsFilters : Map<String, Bool>;
  134. var statusText : h2d.Text;
  135. var posToolTip : h2d.Text;
  136. var scene(get, null): hide.comp.Scene;
  137. function get_scene() return sceneEditor.scene;
  138. public var properties(get, null): hide.comp.PropsEditor;
  139. function get_properties() return sceneEditor.properties;
  140. override function onDisplay() {
  141. if( sceneEditor != null ) sceneEditor.dispose();
  142. data = new hrt.prefab.Library();
  143. var content = sys.io.File.getContent(getPath());
  144. data.loadData(haxe.Json.parse(content));
  145. currentSign = haxe.crypto.Md5.encode(content);
  146. element.html('
  147. <div class="flex vertical">
  148. <div style="flex: 0 0 30px;">
  149. <span class="prefab-toolbar"></span>
  150. </div>
  151. <div class="scene-partition" style="display: flex; flex-direction: row; flex: 1; overflow: hidden;">
  152. <div class="heaps-scene"></div>
  153. <div class="tree-column">
  154. <div class="flex vertical">
  155. <div class="hide-toolbar">
  156. <div class="toolbar-label">
  157. <div class="icon ico ico-sitemap"></div>
  158. Scene
  159. </div>
  160. <div class="button collapse-btn" title="Collapse all">
  161. <div class="icon ico ico-reply-all"></div>
  162. </div>
  163. <div class="button combine-btn layout-btn" title="Toggle columns layout">
  164. <div class="icon ico ico-compress"></div>
  165. </div>
  166. <div class="button separate-btn layout-btn" title="Toggle columns layout">
  167. <div class="icon ico ico-expand"></div>
  168. </div>
  169. <div
  170. class="button hide-cols-btn close-btn"
  171. title="Hide Tree & Props (${config.get("key.sceneeditor.toggleLayout")})"
  172. >
  173. <div class="icon ico ico-chevron-right"></div>
  174. </div>
  175. </div>
  176. <div class="hide-scenetree"></div>
  177. </div>
  178. </div>
  179. <div class="props-column">
  180. <div class="hide-toolbar">
  181. <div class="toolbar-label">
  182. <div class="icon ico ico-sitemap"></div>
  183. Properties
  184. </div>
  185. </div>
  186. <div class="hide-scroll"></div>
  187. </div>
  188. <div
  189. class="button show-cols-btn close-btn"
  190. title="Show Tree & Props (${config.get("key.sceneeditor.toggleLayout")})"
  191. >
  192. <div class="icon ico ico-chevron-left"></div>
  193. </div>
  194. </div>
  195. </div>
  196. ');
  197. tools = new hide.comp.Toolbar(null,element.find(".prefab-toolbar"));
  198. layerToolbar = new hide.comp.Toolbar(null,element.find(".layer-buttons"));
  199. currentVersion = undo.currentID;
  200. sceneEditor = new PrefabSceneEditor(this, data);
  201. element.find(".hide-scenetree").first().append(sceneEditor.tree.element);
  202. element.find(".hide-scroll").first().append(properties.element);
  203. element.find(".heaps-scene").first().append(scene.element);
  204. var treeColumn = element.find(".tree-column").first();
  205. resizablePanel = new hide.comp.ResizablePanel(Horizontal, treeColumn);
  206. resizablePanel.saveDisplayKey = "treeColumn";
  207. resizablePanel.onResize = () -> @:privateAccess if( scene.window != null) scene.window.checkResize();
  208. sceneEditor.tree.element.addClass("small");
  209. refreshColLayout();
  210. element.find(".combine-btn").first().click((_) -> setCombine(true));
  211. element.find(".separate-btn").first().click((_) -> setCombine(false));
  212. element.find(".show-cols-btn").first().click(showColumns);
  213. element.find(".hide-cols-btn").first().click(hideColumns);
  214. element.find(".collapse-btn").click(function(e) {
  215. sceneEditor.collapseTree();
  216. });
  217. keys.register("sceneeditor.toggleLayout", () -> {
  218. if( element.find(".tree-column").first().css('display') == 'none' )
  219. showColumns();
  220. else
  221. hideColumns();
  222. });
  223. refreshSceneFilters();
  224. refreshGraphicsFilters();
  225. }
  226. function refreshColLayout() {
  227. var config = ide.ideConfig;
  228. if( config.sceneEditorLayout == null ) {
  229. config.sceneEditorLayout = {
  230. colsVisible: true,
  231. colsCombined: false,
  232. };
  233. }
  234. setCombine(config.sceneEditorLayout.colsCombined);
  235. if( config.sceneEditorLayout.colsVisible )
  236. showColumns();
  237. else
  238. hideColumns();
  239. if (resizablePanel != null) resizablePanel.setSize();
  240. }
  241. override function onActivate() {
  242. if( sceneEditor != null )
  243. refreshColLayout();
  244. }
  245. function hideColumns(?_) {
  246. element.find(".tree-column").first().hide();
  247. element.find(".props-column").first().hide();
  248. element.find(".splitter").first().hide();
  249. element.find(".show-cols-btn").first().show();
  250. ide.ideConfig.sceneEditorLayout.colsVisible = false;
  251. @:privateAccess ide.config.global.save();
  252. @:privateAccess if( scene.window != null) scene.window.checkResize();
  253. }
  254. function showColumns(?_) {
  255. element.find(".tree-column").first().show();
  256. element.find(".props-column").first().show();
  257. element.find(".splitter").first().show();
  258. element.find(".show-cols-btn").first().hide();
  259. ide.ideConfig.sceneEditorLayout.colsVisible = true;
  260. @:privateAccess ide.config.global.save();
  261. @:privateAccess if( scene.window != null) scene.window.checkResize();
  262. }
  263. function setCombine(val) {
  264. var fullscene = element.find(".scene-partition").first();
  265. var props = element.find(".props-column").first();
  266. fullscene.toggleClass("reduced-columns", val);
  267. if( val ) {
  268. element.find(".hide-scenetree").first().parent().append(props);
  269. element.find(".combine-btn").first().hide();
  270. element.find(".separate-btn").first().show();
  271. resizablePanel.setSize();
  272. } else {
  273. fullscene.append(props);
  274. element.find(".combine-btn").first().show();
  275. element.find(".separate-btn").first().hide();
  276. }
  277. ide.ideConfig.sceneEditorLayout.colsCombined = val;
  278. @:privateAccess ide.config.global.save();
  279. @:privateAccess if( scene.window != null) scene.window.checkResize();
  280. }
  281. public function onSceneReady() {
  282. tools.saveDisplayKey = "Prefab/toolbar";
  283. statusText = new h2d.Text(hxd.res.DefaultFont.get(), scene.s2d);
  284. statusText.setPosition(5, 5);
  285. statusText.visible = false;
  286. var toolsDefs = new Array<hide.comp.Toolbar.ToolDef>();
  287. toolsDefs.push({id: "perspectiveCamera", title : "Perspective camera", icon : "video-camera", type : Button(() -> resetCamera(false)) });
  288. toolsDefs.push({id: "topCamera", title : "Top camera", icon : "video-camera", iconStyle: { transform: "rotateZ(90deg)" }, type : Button(() -> resetCamera(true))});
  289. toolsDefs.push({id: "snapToGroundToggle", title : "Snap to ground", icon : "anchor", type : Toggle((v) -> sceneEditor.snapToGround = v)});
  290. toolsDefs.push({id: "localTransformsToggle", title : "Local transforms", icon : "compass", type : Toggle((v) -> sceneEditor.localTransform = v)});
  291. toolsDefs.push({id: "gridToggle", title : "Toggle grid", icon : "th", type : Toggle((v) -> { showGrid = v; updateGrid(); }) });
  292. var texContent : Element = null;
  293. toolsDefs.push({id: "sceneInformationToggle", title : "Scene information", icon : "info-circle", type : Toggle((b) -> statusText.visible = b), rightClick: () -> {
  294. if( texContent != null ) {
  295. texContent.remove();
  296. texContent = null;
  297. }
  298. new hide.comp.ContextMenu([
  299. {
  300. label : "Show Texture Details",
  301. click : function() {
  302. var memStats = scene.engine.mem.stats();
  303. var texs = @:privateAccess scene.engine.mem.textures;
  304. var list = [for(t in texs) {
  305. n: '${t.width}x${t.height} ${t.format} ${t.name}',
  306. size: t.width * t.height
  307. }];
  308. list.sort((a, b) -> Reflect.compare(b.size, a.size));
  309. var content = new Element('<div tabindex="1" class="overlay-info"><h2>Scene info</h2><pre></pre></div>');
  310. new Element(element[0].ownerDocument.body).append(content);
  311. var pre = content.find("pre");
  312. pre.text([for(l in list) l.n].join("\n"));
  313. texContent = content;
  314. content.blur(function(_) {
  315. content.remove();
  316. texContent = null;
  317. });
  318. }
  319. }
  320. ]);
  321. }});
  322. toolsDefs.push({id: "autoSyncToggle", title : "Auto synchronize", icon : "refresh", type : Toggle((b) -> autoSync = b)});
  323. toolsDefs.push({id: "backgroundColor", title : "Background Color", type : Color(function(v) {
  324. scene.engine.backgroundColor = v;
  325. updateGrid();
  326. })});
  327. toolsDefs.push({id: "graphicsFilters", title : "Graphics filters", type : Menu(filtersToMenuItem(graphicsFilters, "Graphics"))});
  328. toolsDefs.push({id: "sceneFilters", title : "Scene filters", type : Menu(filtersToMenuItem(sceneFilters, "Scene"))});
  329. toolsDefs.push({id: "sceneSpeed", title : "Speed", type : Range((v) -> scene.speed = v)});
  330. for (tool in toolsDefs) {
  331. var key = config.get("key.sceneeditor." + tool.id);
  332. var shortcut = key != null ? " (" + key + ")" : "";
  333. var el : Element = null;
  334. switch(tool.type) {
  335. case Button(f):
  336. el = tools.addButton(tool.icon, tool.title + shortcut, f);
  337. case Toggle(f):
  338. var toggle = tools.addToggle(tool.icon, tool.title + shortcut, f);
  339. el = toggle.element;
  340. if( key != null )
  341. keys.register("sceneeditor." + tool.id, () -> toggle.toggle(!toggle.isDown()));
  342. if (tool.rightClick != null)
  343. toggle.rightClick(tool.rightClick);
  344. case Color(f):
  345. el = tools.addColor(tool.title, f).element;
  346. case Range(f):
  347. el = tools.addRange(tool.title, f, 1.).element;
  348. case Menu(items):
  349. var menu = tools.addMenu(tool.icon, tool.title);
  350. menu.setContent(items);
  351. el = menu.element;
  352. }
  353. el.addClass(tool.id);
  354. if(tool.iconStyle != null)
  355. el.find(".icon").css(tool.iconStyle);
  356. }
  357. posToolTip = new h2d.Text(hxd.res.DefaultFont.get(), scene.s2d);
  358. posToolTip.dropShadow = { dx : 1, dy : 1, color : 0, alpha : 0.5 };
  359. updateStats();
  360. updateGrid();
  361. initGraphicsFilters();
  362. }
  363. function updateStats() {
  364. var memStats = scene.engine.mem.stats();
  365. @:privateAccess
  366. var lines : Array<String> = [
  367. 'Scene objects: ${scene.s3d.getObjectsCount()}',
  368. 'Interactives: ' + sceneEditor.interactives.count(),
  369. 'Contexts: ' + sceneEditor.context.shared.contexts.count(),
  370. 'Triangles: ${scene.engine.drawTriangles}',
  371. 'Buffers: ${memStats.bufferCount}',
  372. 'Textures: ${memStats.textureCount}',
  373. 'FPS: ${Math.round(scene.engine.realFps)}',
  374. 'Draw Calls: ${scene.engine.drawCalls}',
  375. ];
  376. statusText.text = lines.join("\n");
  377. haxe.Timer.delay(function() sceneEditor.event.wait(0.5, updateStats), 0);
  378. }
  379. function resetCamera( top : Bool ) {
  380. var targetPt = new h3d.col.Point(0, 0, 0);
  381. var curEdit = sceneEditor.curEdit;
  382. if(curEdit != null && curEdit.rootObjects.length > 0) {
  383. targetPt = curEdit.rootObjects[0].getAbsPos().getPosition().toPoint();
  384. }
  385. if(top)
  386. sceneEditor.cameraController.set(200, Math.PI/2, 0.001, targetPt);
  387. else
  388. sceneEditor.cameraController.set(200, -4.7, 0.8, targetPt);
  389. sceneEditor.cameraController.toTarget();
  390. }
  391. override function getDefaultContent() {
  392. return haxe.io.Bytes.ofString(ide.toJSON(new hrt.prefab.Library().saveData()));
  393. }
  394. override function canSave() {
  395. return data != null;
  396. }
  397. override function save() {
  398. if( !canSave() )
  399. return;
  400. var content = ide.toJSON(data.saveData());
  401. var newSign = haxe.crypto.Md5.encode(content);
  402. if(newSign != currentSign)
  403. haxe.Timer.delay(saveBackup.bind(content), 0);
  404. currentSign = newSign;
  405. sys.io.File.saveContent(getPath(), content);
  406. super.save();
  407. }
  408. function updateGrid() {
  409. if(grid != null) {
  410. grid.remove();
  411. grid = null;
  412. }
  413. if(!showGrid)
  414. return;
  415. grid = new h3d.scene.Graphics(scene.s3d);
  416. grid.scale(1);
  417. grid.material.mainPass.setPassName("debuggeom");
  418. gridStep = ide.currentConfig.get("sceneeditor.gridStep");
  419. gridSize = ide.currentConfig.get("sceneeditor.gridSize");
  420. var col = h3d.Vector.fromColor(scene.engine.backgroundColor);
  421. var hsl = col.toColorHSL();
  422. if(hsl.z > 0.5) hsl.z -= 0.1;
  423. else hsl.z += 0.1;
  424. col.makeColor(hsl.x, hsl.y, hsl.z);
  425. grid.lineStyle(1.0, col.toColor(), 1.0);
  426. for(i in 0...(hxd.Math.floor(gridSize / gridStep) + 1)) {
  427. grid.moveTo(i * gridStep, 0, 0);
  428. grid.lineTo(i * gridStep, gridSize, 0);
  429. grid.moveTo(0, i * gridStep, 0);
  430. grid.lineTo(gridSize, i * gridStep, 0);
  431. }
  432. grid.lineStyle(0);
  433. grid.setPosition(-1 * gridSize / 2, -1 * gridSize / 2, 0);
  434. }
  435. function onUpdate(dt:Float) {
  436. if(K.isDown(K.ALT)) {
  437. posToolTip.visible = true;
  438. var proj = sceneEditor.screenToGround(scene.s2d.mouseX, scene.s2d.mouseY);
  439. posToolTip.text = proj != null ? '${Math.fmt(proj.x)}, ${Math.fmt(proj.y)}, ${Math.fmt(proj.z)}' : '???';
  440. posToolTip.setPosition(scene.s2d.mouseX, scene.s2d.mouseY - 12);
  441. }
  442. else {
  443. posToolTip.visible = false;
  444. }
  445. if( autoSync && (currentVersion != undo.currentID || lastSyncChange != properties.lastChange) ) {
  446. save();
  447. lastSyncChange = properties.lastChange;
  448. currentVersion = undo.currentID;
  449. }
  450. }
  451. function onRefresh() {
  452. }
  453. override function onDragDrop(items : Array<String>, isDrop : Bool) {
  454. return sceneEditor.onDragDrop(items, isDrop);
  455. }
  456. function applyGraphicsFilters(typeid: String, enable: Bool)
  457. {
  458. saveDisplayState("graphicsFilters/" + typeid, enable);
  459. var r : h3d.scene.Renderer = scene.s3d.renderer;
  460. switch (typeid)
  461. {
  462. case "shadows":
  463. r.shadows = enable;
  464. case "ssr":
  465. var effect = r.getEffect(hrt.prefab.rfx.SSR);
  466. if (effect != null)
  467. effect.enabled = enable;
  468. default:
  469. }
  470. }
  471. function applySceneFilter(typeid: String, visible: Bool) {
  472. saveDisplayState("sceneFilters/" + typeid, visible);
  473. var all = data.flatten(hrt.prefab.Prefab);
  474. for(p in all) {
  475. if(p.type == typeid || p.getCdbType() == typeid) {
  476. sceneEditor.applySceneStyle(p);
  477. }
  478. }
  479. }
  480. function refreshSceneFilters() {
  481. var filters : Array<String> = ide.currentConfig.get("sceneeditor.filterTypes");
  482. filters = filters.copy();
  483. for(sheet in DataFiles.getAvailableTypes()) {
  484. filters.push(DataFiles.getTypeName(sheet));
  485. }
  486. sceneFilters = new Map();
  487. for(f in filters) {
  488. sceneFilters.set(f, getDisplayState("sceneFilters/" + f) != false);
  489. }
  490. }
  491. function initGraphicsFilters() {
  492. for (typeid in graphicsFilters.keys())
  493. {
  494. applyGraphicsFilters(typeid, graphicsFilters.get(typeid));
  495. }
  496. }
  497. function refreshGraphicsFilters() {
  498. var filters : Array<String> = ["shadows", "ssr"];
  499. filters = filters.copy();
  500. graphicsFilters = new Map();
  501. for(f in filters) {
  502. graphicsFilters.set(f, getDisplayState("graphicsFilters/" + f) != false);
  503. }
  504. }
  505. function filtersToMenuItem(filters : Map<String, Bool>, type : String) : Array<hide.comp.ContextMenu.ContextMenuItem> {
  506. var content : Array<hide.comp.ContextMenu.ContextMenuItem> = [];
  507. var initDone = false;
  508. for(typeid in filters.keys()) {
  509. content.push({label : typeid, checked : filters[typeid], click : function() {
  510. var on = !filters[typeid];
  511. filters.set(typeid, on);
  512. if(initDone)
  513. switch (type){
  514. case "Graphics":
  515. applyGraphicsFilters(typeid, on);
  516. case "Scene":
  517. applySceneFilter(typeid, on);
  518. }
  519. content.find(function(item) return item.label == typeid).checked = on;
  520. }});
  521. }
  522. initDone = true;
  523. return content;
  524. }
  525. function applyTreeStyle(p: PrefabElement, el: Element, pname: String) {
  526. }
  527. function onPrefabChange(p: PrefabElement, ?pname: String) {
  528. }
  529. function applySceneStyle(p: PrefabElement) {
  530. var prefabView = Std.downcast(p, hrt.prefab.Library); // don't use "to" (Reference)
  531. if( prefabView != null && prefabView.parent == null ) {
  532. updateGrid();
  533. return;
  534. }
  535. var obj3d = p.to(Object3D);
  536. if(obj3d != null) {
  537. var visible = obj3d.visible && !sceneEditor.isHidden(obj3d) && sceneFilters.get(p.type) != false;
  538. if(visible) {
  539. var cdbType = p.getCdbType();
  540. if(cdbType != null && sceneFilters.get(cdbType) == false)
  541. visible = false;
  542. }
  543. for(ctx in sceneEditor.getContexts(obj3d)) {
  544. ctx.local3d.visible = visible;
  545. }
  546. }
  547. var color = getDisplayColor(p);
  548. if(color != null){
  549. color = (color & 0xffffff) | 0xa0000000;
  550. var box = p.to(hrt.prefab.l3d.Box);
  551. if(box != null) {
  552. var ctx = sceneEditor.getContext(box);
  553. box.setColor(ctx, color);
  554. }
  555. var poly = p.to(hrt.prefab.l3d.Polygon);
  556. if(poly != null) {
  557. var ctx = sceneEditor.getContext(poly);
  558. poly.setColor(ctx, color);
  559. }
  560. }
  561. }
  562. function getDisplayColor(p: PrefabElement) : Null<Int> {
  563. var typeId = p.getCdbType();
  564. if(typeId != null) {
  565. var colors = ide.currentConfig.get("sceneeditor.colors");
  566. var color = Reflect.field(colors, typeId);
  567. if(color != null) {
  568. return Std.parseInt("0x"+color.substr(1)) | 0xff000000;
  569. }
  570. }
  571. return null;
  572. }
  573. static var _ = FileTree.registerExtension(Prefab, ["prefab"], { icon : "sitemap", createNew : "Prefab" });
  574. static var _1 = FileTree.registerExtension(Prefab, ["l3d"], { icon : "sitemap" });
  575. }