From 73fcf429d06a5dc1873dfedf2671b45e6e63d59f Mon Sep 17 00:00:00 2001 From: Thomas Geymayer <tomgey@gmail.com> Date: Wed, 9 Jan 2013 12:14:31 +0100 Subject: [PATCH 1/3] Canvas/SVG fix calculating transformation center (Group) --- Nasal/canvas/api.nas | 55 ++++++++++++++++++++++---------------------- Nasal/canvas/svg.nas | 13 +++++++---- 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/Nasal/canvas/api.nas b/Nasal/canvas/api.nas index 96d9d72bb..fc9a8366a 100644 --- a/Nasal/canvas/api.nas +++ b/Nasal/canvas/api.nas @@ -137,17 +137,10 @@ var Element = { # @param ghost Element ghost as retrieved from core methods new: func(ghost) { - var m = { + return { parents: [PropertyElement, Element, ghost], _node: props.wrapNode(ghost._node_ghost) }; - - m._center = [ - m._node.getNode("center[0]"), - m._node.getNode("center[1]") - ]; - - return m; }, # Trigger an update of the element # @@ -229,6 +222,22 @@ var Element = { return [0, 0, 0, 0]; }, + # Calculate the transformation center based on bounding box and center-offset + updateCenter: func + { + me.update(); + var bb = me.getTransformedBounds(); + + if( bb[0] > bb[2] or bb[1] > bb[3] ) + return; + + me._setupCenterNodes + ( + (bb[0] + bb[2]) / 2 + (me.get("center-offset-x") or 0), + (bb[1] + bb[3]) / 2 + (me.get("center-offset-y") or 0) + ); + return me; + }, # Set transformation center (currently only used for rotation) setCenter: func() { @@ -236,24 +245,13 @@ var Element = { if( size(center) != 2 ) return debug.warn("invalid arg"); - me._setupCenterNodes(); - - if( me._center[0] == nil ) - me._center[0] = me._node.getNode("center[0]", 1); - if( me._center[1] == nil ) - me._center[1] = me._node.getNode("center[1]", 1); - - me._center[0].setDoubleValue(center[0] or 0); - me._center[1].setDoubleValue(center[1] or 0); - + me._setupCenterNodes(center[0], center[1]); return me; }, # Get transformation center getCenter: func() { - var bb = me.getBoundingBox(); var center = [0, 0]; - me._setupCenterNodes(); if( me._center[0] != nil ) @@ -261,11 +259,7 @@ var Element = { if( me._center[1] != nil ) center[1] = me._center[1].getValue() or 0; - if( bb[0] >= bb[2] or bb[1] >= bb[3] ) - return center; - - return [ 0.5 * (bb[0] + bb[2]) + center[0], - 0.5 * (bb[1] + bb[3]) + center[1] ]; + return center; }, # Internal Transform for convenience transform functions _getTf: func @@ -274,13 +268,18 @@ var Element = { me['_tf'] = me.createTransform(); return me._tf; }, - _setupCenterNodes: func() + _setupCenterNodes: func(cx = nil, cy = nil) { if( me["_center"] == nil ) me["_center"] = [ - me._node.getNode("center[0]"), - me._node.getNode("center[1]") + me._node.getNode("center[0]", cx != nil), + me._node.getNode("center[1]", cy != nil) ]; + + if( cx != nil ) + me._center[0].setDoubleValue(cx); + if( cy != nil ) + me._center[1].setDoubleValue(cy); } }; diff --git a/Nasal/canvas/svg.nas b/Nasal/canvas/svg.nas index 1ee75b520..b6beb4d45 100644 --- a/Nasal/canvas/svg.nas +++ b/Nasal/canvas/svg.nas @@ -357,11 +357,6 @@ var parsesvg = func(group, path, options = nil) if( dash and size(dash) > 3 ) # at least 2 comma separated values... stack[-1].setStrokeDashArray(split(',', dash)); - - var cx = attr['inkscape:transform-center-x']; - var cy = attr['inkscape:transform-center-y']; - if( cx != nil or cy != nil ) - stack[-1].setCenter(cx or 0, -(cy or 0)); } else if( name == "tspan" ) { @@ -392,6 +387,14 @@ var parsesvg = func(group, path, options = nil) } parseTransform(attr['transform']); + + var cx = attr['inkscape:transform-center-x']; + if( cx != nil and cx != 0 ) + stack[-1].setDouble("center-offset-x", cx); + + var cy = attr['inkscape:transform-center-y']; + if( cy != nil and cy != 0 ) + stack[-1].setDouble("center-offset-y", -cy); }; # XML parsers element close callback From 6d8940c4e05e3ff70a8c8e4b8f0a8d714874c69b Mon Sep 17 00:00:00 2001 From: Thorsten Renk <thorsten.i.renk@jyu.fi> Date: Thu, 10 Jan 2013 13:21:14 +0200 Subject: [PATCH 2/3] Bugfix creating well-defined starting and re-starting conditions for Advanced Weather precipitation --- Nasal/local_weather/compat_layer.nas | 6 ++++++ Nasal/local_weather/local_weather.nas | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/Nasal/local_weather/compat_layer.nas b/Nasal/local_weather/compat_layer.nas index 02382c673..3ea3a4b32 100644 --- a/Nasal/local_weather/compat_layer.nas +++ b/Nasal/local_weather/compat_layer.nas @@ -172,6 +172,12 @@ setprop("/sim/rendering/clouds3d-wrap",0); # Basic Weather rain altitude limit off props.globals.getNode("/environment/params/use-external-precipitation-level").setBoolValue("true"); + +# rain and snow off for clean startup + +compat_layer.setRain(0.0); +compat_layer.setSnow(0.0); +compat_layer.setLight(1.0); } diff --git a/Nasal/local_weather/local_weather.nas b/Nasal/local_weather/local_weather.nas index 5134ca17c..c6203c9cd 100644 --- a/Nasal/local_weather/local_weather.nas +++ b/Nasal/local_weather/local_weather.nas @@ -1663,6 +1663,12 @@ setprop(lw~"clouds/placement-index",0); setprop(lw~"clouds/model-placement-index",0); setprop(lw~"effect-volumes/effect-placement-index",0); setprop(lw~"effect-volumes/number",0); +setprop(lw~"effect-volumes/number-active-rain",0); +setprop(lw~"effect-volumes/number-active-snow",0); +setprop(lw~"effect-volumes/number-active-vis",0); +setprop(lw~"effect-volumes/number-active-turb",0); +setprop(lw~"effect-volumes/number-active-lift",0); +setprop(lw~"effect-volumes/number-active-sat",0); setprop(lw~"tiles/tile-counter",0); From ef95c4cf10e97bbbf53914e604a7a5346d7c2c29 Mon Sep 17 00:00:00 2001 From: Thomas Geymayer <tomgey@gmail.com> Date: Fri, 11 Jan 2013 19:56:42 +0100 Subject: [PATCH 3/3] parsesvg: fix checking for relative/absolute path --- Nasal/canvas/svg.nas | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Nasal/canvas/svg.nas b/Nasal/canvas/svg.nas index b6beb4d45..750e0f92d 100644 --- a/Nasal/canvas/svg.nas +++ b/Nasal/canvas/svg.nas @@ -426,8 +426,21 @@ var parsesvg = func(group, path, options = nil) stack[-1].setText(data); }; - if( path[0] != '/' ) - path = getprop("/sim/fg-root") ~ "/" ~ path; + # check path relative to standard locations + foreach( + var p; + [ "", # absolute path + getprop("/sim/aircraft-dir") ~ "/", # current aircraft path + getprop("/sim/fg-root") ~ "/" # fgdata + ]) + { + var tmp_path = p ~ path; + if( io.stat(tmp_path) != nil ) + { + path = tmp_path; + break; + } + } call(func parsexml(path, start, end, data), nil, var err = []); if( size(err) )