From 3ded0cfa9e3a76f881952a0003e2bc680c3dc4a5 Mon Sep 17 00:00:00 2001 From: Richard Pastrick Date: Mon, 9 Apr 2012 11:49:03 -0700 Subject: [PATCH 1/5] Add validator and definition for beginnings of overlay python glue so that only the right overlays show up for a specific render --- overviewer_core/settingsDefinition.py | 1 + overviewer_core/settingsValidators.py | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/overviewer_core/settingsDefinition.py b/overviewer_core/settingsDefinition.py index 54fb763..dc8a518 100644 --- a/overviewer_core/settingsDefinition.py +++ b/overviewer_core/settingsDefinition.py @@ -79,6 +79,7 @@ renders = Setting(required=True, default=util.OrderedDict(), "crop": Setting(required=False, validator=validateCrop, default=None), "changelist": Setting(required=False, validator=validateStr, default=None), "markers": Setting(required=False, validator=validateMarkers, default=[]), + "overlay": Setting(required=False, validator=validateOverlays, default=[]), # Remove this eventually (once people update their configs) "worldname": Setting(required=False, default=None, diff --git a/overviewer_core/settingsValidators.py b/overviewer_core/settingsValidators.py index d8846b1..7b023a8 100644 --- a/overviewer_core/settingsValidators.py +++ b/overviewer_core/settingsValidators.py @@ -51,6 +51,13 @@ def validateMarkers(filterlist): raise ValidationException("%r must be a function"% x) return filterlist +def validateOverlays(renderlist): + if type(renderlist) != list: + raise ValidationException("Overlay must specify a list of renders") + for x in renderlist: + print x + return renderlist + def validateWorldPath(worldpath): _, worldpath = checkBadEscape(worldpath) abs_path = os.path.abspath(os.path.expanduser(worldpath)) From ebd8b287ed48dca08f46a3145cd8a8ad4d9a0763 Mon Sep 17 00:00:00 2001 From: Richard Pastrick Date: Mon, 9 Apr 2012 12:20:58 -0700 Subject: [PATCH 2/5] Further glue for overlays. Make the validator actually validate. Also rough outlines for checking if the render you've specified in the overlay actually exists and isn't itself. --- overviewer.py | 15 +++++++++++++++ overviewer_core/settingsValidators.py | 3 ++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/overviewer.py b/overviewer.py index 8a774f9..2a93845 100755 --- a/overviewer.py +++ b/overviewer.py @@ -304,6 +304,21 @@ dir but you forgot to put quotes around the directory, since it contains spaces. if render.get('forcerender', False): render['renderchecks'] = 2 + # check if overlays are set, if so, make sure that those renders exist + if render.get('overlay', []) != []: + for x in render.get('overlay'): + if x != rname: + try: + renderLink = config['renders'][x] + except KeyError: + logging.error("Render %s's overlay is '%s', but I could not find a corresponding entry in the renders dictionary.", + rname, x) + return 1 + # TODO: Link the overlay rendering to the render modes it is used for so that the JS can properly fill in the dropdown + else: + logging.error("Render %s's overlay contains itself.", rname) + return 1 + destdir = config['outputdir'] if not destdir: logging.error("You must specify the output directory in your config file.") diff --git a/overviewer_core/settingsValidators.py b/overviewer_core/settingsValidators.py index 7b023a8..227f4d3 100644 --- a/overviewer_core/settingsValidators.py +++ b/overviewer_core/settingsValidators.py @@ -55,7 +55,8 @@ def validateOverlays(renderlist): if type(renderlist) != list: raise ValidationException("Overlay must specify a list of renders") for x in renderlist: - print x + if validateStr(x) == '': + raise ValidationException("%r must be a string"% x) return renderlist def validateWorldPath(worldpath): From 77acd158c6414646a2e4830e5125c311900cd003 Mon Sep 17 00:00:00 2001 From: Richard Pastrick Date: Mon, 9 Apr 2012 12:26:40 -0700 Subject: [PATCH 3/5] Add docs too! --- docs/config.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/config.rst b/docs/config.rst index 1884573..b2c9df6 100644 --- a/docs/config.rst +++ b/docs/config.rst @@ -480,6 +480,18 @@ values. The valid configuration keys are listed below. **Default:** ``[]`` (an empty list) +.. _option_overlay: + +``overlay`` + This specifies which renders that this render will be displayed on top of. + It should be a list of renders. + + .. warning:: + + At this time, this feature is not fully implemented. + + **Default:** ``[]`` (an empty list) + .. _customrendermodes: Custom Rendermodes and Rendermode Primitives From b13bbd02048c8c259b8381b533fd8e87975ba78f Mon Sep 17 00:00:00 2001 From: Richard Pastrick Date: Thu, 12 Apr 2012 08:59:13 -0700 Subject: [PATCH 4/5] Add the JS stuff and a little bit more python glue to make overlays only display for a specified render --- overviewer.py | 2 +- overviewer_core/data/js_src/util.js | 5 +-- overviewer_core/data/js_src/views.js | 47 ++++++++++++++-------------- overviewer_core/tileset.py | 3 ++ 4 files changed, 31 insertions(+), 26 deletions(-) diff --git a/overviewer.py b/overviewer.py index 2a93845..0733ddf 100755 --- a/overviewer.py +++ b/overviewer.py @@ -418,7 +418,7 @@ dir but you forgot to put quotes around the directory, since it contains spaces. # only pass to the TileSet the options it really cares about render['name'] = render_name # perhaps a hack. This is stored here for the asset manager - tileSetOpts = util.dict_subset(render, ["name", "imgformat", "renderchecks", "rerenderprob", "bgcolor", "imgquality", "optimizeimg", "rendermode", "worldname_orig", "title", "dimension", "changelist"]) + tileSetOpts = util.dict_subset(render, ["name", "imgformat", "renderchecks", "rerenderprob", "bgcolor", "imgquality", "optimizeimg", "rendermode", "worldname_orig", "title", "dimension", "changelist", "overlay"]) tileSetOpts.update({"spawn": w.find_true_spawn()}) # TODO find a better way to do this tset = tileset.TileSet(rset, assetMrg, tex, tileSetOpts, tileset_dir) tilesets.append(tset) diff --git a/overviewer_core/data/js_src/util.js b/overviewer_core/data/js_src/util.js index 350f7f4..81cc5c0 100644 --- a/overviewer_core/data/js_src/util.js +++ b/overviewer_core/data/js_src/util.js @@ -64,8 +64,6 @@ overviewer.util = { } var overlayControl = new overviewer.views.OverlayControlView(); - overlayControl.registerEvents(overlayControl); - overlayControl.render(); var spawnmarker = new overviewer.views.SpawnIconView(); @@ -85,6 +83,9 @@ overviewer.util = { compass.render(); spawnmarker.render(); + // update list of spawn overlays + overlayControl.render(); + // re-center on the last viewport var currentWorldView = overviewer.mapModel.get("currentWorldView"); if (currentWorldView.options.lastViewport) { diff --git a/overviewer_core/data/js_src/views.js b/overviewer_core/data/js_src/views.js index cafcb1b..21fbaac 100644 --- a/overviewer_core/data/js_src/views.js +++ b/overviewer_core/data/js_src/views.js @@ -23,8 +23,9 @@ overviewer.views.WorldView = Backbone.View.extend({ newMapType.shortname = tset.get("name"); newMapType.alt = "Minecraft " + tset.get("name") + " Map"; newMapType.projection = new overviewer.classes.MapProjection(); - + if (tset.get("isOverlay")) { + newMapType.tiles = tset.get("tilesets"); this.options.overlayMapTypes.push(newMapType); this.options.overlayMapTypeIds.push(overviewerConfig.CONST.mapDivId + this.model.get("name") + tset.get("name")); } else { @@ -231,7 +232,6 @@ overviewer.views.OverlayControlView = Backbone.View.extend({ }, registerEvents: function(me) { overviewer.mapModel.bind("change:currentWorldView", me.render, me); - }, /** @@ -246,8 +246,7 @@ overviewer.views.OverlayControlView = Backbone.View.extend({ // if this world has no overlays, don't create this control var mapTypes = overviewer.mapModel.get('currentWorldView').options.overlayMapTypes; if (mapTypes.length == 0) { return; } - - + var controlText = document.createElement('DIV'); controlText.innerHTML = "Overlays"; @@ -265,32 +264,34 @@ overviewer.views.OverlayControlView = Backbone.View.extend({ $(controlBorder).toggleClass('top-active'); $(dropdownDiv).toggle(); }); - + var currentTileSetPath = overviewer.mapView.options.currentTileSet.get('path'); + for (i in mapTypes) { var mt = mapTypes[i]; - this.addItem({label: mt.name, - name: mt.name, - mt: mt, + if (mt.tiles.indexOf(currentTileSetPath)!=-1) { + this.addItem({label: mt.name, + name: mt.name, + mt: mt, - action: function(this_item, checked) { - //console.log(this_item); - if (checked) { - overviewer.map.overlayMapTypes.push(this_item.mt); - } else { - var idx_to_delete = -1; - overviewer.map.overlayMapTypes.forEach(function(e, j) { - if (e == this_item.mt) { - idx_to_delete = j; + action: function(this_item, checked) { + if (checked) { + overviewer.map.overlayMapTypes.push(this_item.mt); + } else { + var idx_to_delete = -1; + overviewer.map.overlayMapTypes.forEach(function(e, j) { + if (e == this_item.mt) { + idx_to_delete = j; + } + }); + if (idx_to_delete >= 0) { + overviewer.map.overlayMapTypes.removeAt(idx_to_delete); } - }); - if (idx_to_delete >= 0) { - overviewer.map.overlayMapTypes.removeAt(idx_to_delete); } - } - } - }) + } + }) + } } diff --git a/overviewer_core/tileset.py b/overviewer_core/tileset.py index 6919884..a08443d 100644 --- a/overviewer_core/tileset.py +++ b/overviewer_core/tileset.py @@ -524,6 +524,9 @@ class TileSet(object): imgextension = self.imgextension, isOverlay = isOverlay ) + if isOverlay: + d.update({"tilesets": self.options.get("overlay")}) + if (self.regionset.get_type() == "overworld"): d.update({"spawn": self.options.get("spawn")}) try: From 805618dd2fd1763ac676c12fd19e8d598bf0cfdd Mon Sep 17 00:00:00 2001 From: Richard Pastrick Date: Thu, 12 Apr 2012 09:03:14 -0700 Subject: [PATCH 5/5] remove todo since I did that part --- overviewer.py | 1 - 1 file changed, 1 deletion(-) diff --git a/overviewer.py b/overviewer.py index 0733ddf..728ff82 100755 --- a/overviewer.py +++ b/overviewer.py @@ -314,7 +314,6 @@ dir but you forgot to put quotes around the directory, since it contains spaces. logging.error("Render %s's overlay is '%s', but I could not find a corresponding entry in the renders dictionary.", rname, x) return 1 - # TODO: Link the overlay rendering to the render modes it is used for so that the JS can properly fill in the dropdown else: logging.error("Render %s's overlay contains itself.", rname) return 1