|
@@ -82,35 +82,46 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I
|
|
**/
|
|
**/
|
|
public var height(default, null) : Int;
|
|
public var height(default, null) : Int;
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ Viewport horizontal scale transform value. Converts from scene space to screen space of [0, 2] range.
|
|
|
|
+ **/
|
|
|
|
+ var viewportA(default, null) : Float;
|
|
|
|
+ /**
|
|
|
|
+ Viewport vertical scale transform value. Converts from scene space to screen space of [0, 2] range.
|
|
|
|
+ **/
|
|
|
|
+ var viewportD(default, null) : Float;
|
|
/**
|
|
/**
|
|
Horizontal viewport offset relative to top-left corner of the window. Can change if the screen gets resized or `scaleMode` changes.
|
|
Horizontal viewport offset relative to top-left corner of the window. Can change if the screen gets resized or `scaleMode` changes.
|
|
- Offset is in internal Scene resolution pixels.
|
|
|
|
|
|
+ Offset is in screen-space coordinates: [-1, 1] where 0 is center of the window.
|
|
**/
|
|
**/
|
|
- public var viewportX(default, null) : Float;
|
|
|
|
|
|
+ var viewportX(default, null) : Float;
|
|
/**
|
|
/**
|
|
Vertical viewport offset relative to top-left corner of the window. Can change if the screen gets resized or `scaleMode` changes.
|
|
Vertical viewport offset relative to top-left corner of the window. Can change if the screen gets resized or `scaleMode` changes.
|
|
- Offset is in internal Scene resolution pixels.
|
|
|
|
|
|
+ Offset is in screen-space coordinates: [-1, 1] where 0 is center of the window.
|
|
**/
|
|
**/
|
|
- public var viewportY(default, null) : Float;
|
|
|
|
|
|
+ var viewportY(default, null) : Float;
|
|
|
|
+
|
|
/**
|
|
/**
|
|
- Physical vertical viewport offset relative to the center of the window. Assigned if the screen gets resized or `scaleMode` changes.
|
|
|
|
- Offset is in internal Scene resolution pixels.
|
|
|
|
|
|
+ Horizontal viewport offset relative to top-left corner of the window in pixels.
|
|
|
|
+ Assigned if the screen gets resized or `scaleMode` changes.
|
|
**/
|
|
**/
|
|
- public var offsetX : Float;
|
|
|
|
|
|
+ var offsetX(default, null) : Float;
|
|
/**
|
|
/**
|
|
- Physical horizontal viewport offset relative to the center of the window. Assigned if the screen gets resized or `scaleMode` changes.
|
|
|
|
- Offset is in internal Scene resolution pixels.
|
|
|
|
|
|
+ Vertical viewport offset relative to top-left corner of the window in pixels.
|
|
|
|
+ Assigned if the screen gets resized or `scaleMode` changes.
|
|
**/
|
|
**/
|
|
- public var offsetY : Float;
|
|
|
|
|
|
+ var offsetY(default, null) : Float;
|
|
|
|
|
|
/**
|
|
/**
|
|
- Horizontal ratio of the window used by the Scene (including scaling). Can change if the screen gets resized or `scaleMode` changes.
|
|
|
|
|
|
+ Horizontal scale of a scene when rendering to screen.
|
|
|
|
+ Can change if the screen gets resized or `scaleMode` changes.
|
|
**/
|
|
**/
|
|
- public var ratioX(default, null) : Float;
|
|
|
|
|
|
+ public var viewportScaleX(default, null) : Float;
|
|
/**
|
|
/**
|
|
- Vertical ratio of the window used by the Scene (including scaling). Can change if the screen gets resized or `scaleMode` changes.
|
|
|
|
|
|
+ Vertical scale of a scene when rendering to screen.
|
|
|
|
+ Can change if the screen gets resized or `scaleMode` changes.
|
|
**/
|
|
**/
|
|
- public var ratioY(default, null) : Float;
|
|
|
|
|
|
+ public var viewportScaleY(default, null) : Float;
|
|
|
|
|
|
/**
|
|
/**
|
|
The current mouse X coordinates (in pixel) relative to the scene.
|
|
The current mouse X coordinates (in pixel) relative to the scene.
|
|
@@ -137,6 +148,26 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I
|
|
**/
|
|
**/
|
|
public var scaleMode(default, set) : ScaleMode = Resize;
|
|
public var scaleMode(default, set) : ScaleMode = Resize;
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ List of all cameras attached to the Scene. Should contain at least one camera to render (created by default).
|
|
|
|
+ Override `h2d.Camera.layerVisible` method to filter out specific layers from camera rendering.
|
|
|
|
+ To add or remove cameras use `addCamera` and `removeCamera` methods.
|
|
|
|
+ **/
|
|
|
|
+ public var cameras(get, never) : haxe.ds.ReadOnlyArray<Camera>;
|
|
|
|
+ var _cameras : Array<Camera>;
|
|
|
|
+ /**
|
|
|
|
+ Alias to first camera in the list: `cameras[0]`
|
|
|
|
+ **/
|
|
|
|
+ public var camera(get, never) : Camera;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ Camera instance that handles scene events.
|
|
|
|
+ Due to Heaps structure, only one Camera can work with the Interactives.
|
|
|
|
+ Contrary to rendering, event handling does not check if layer is visible for camera or not.
|
|
|
|
+ Should never be null. If Camera does not belong to the Scene, it will be added with `Scene.addCamera`.
|
|
|
|
+ **/
|
|
|
|
+ public var interactiveCamera(default, set) : Camera;
|
|
|
|
+
|
|
/**
|
|
/**
|
|
Set the default value for `h2d.Drawable.smooth` (default: false)
|
|
Set the default value for `h2d.Drawable.smooth` (default: false)
|
|
**/
|
|
**/
|
|
@@ -162,14 +193,19 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I
|
|
super(null);
|
|
super(null);
|
|
var e = h3d.Engine.getCurrent();
|
|
var e = h3d.Engine.getCurrent();
|
|
ctx = new RenderContext(this);
|
|
ctx = new RenderContext(this);
|
|
|
|
+ _cameras = [];
|
|
|
|
+ new Camera(this);
|
|
|
|
+ interactiveCamera = camera;
|
|
width = e.width;
|
|
width = e.width;
|
|
height = e.height;
|
|
height = e.height;
|
|
|
|
+ viewportA = 2 / e.width;
|
|
|
|
+ viewportD = 2 / e.height;
|
|
|
|
+ viewportX = -1;
|
|
|
|
+ viewportY = -1;
|
|
|
|
+ viewportScaleX = 1;
|
|
|
|
+ viewportScaleY = 1;
|
|
offsetX = 0;
|
|
offsetX = 0;
|
|
offsetY = 0;
|
|
offsetY = 0;
|
|
- ratioX = 1;
|
|
|
|
- ratioY = 1;
|
|
|
|
- viewportX = 0;
|
|
|
|
- viewportY = 0;
|
|
|
|
interactive = new Array();
|
|
interactive = new Array();
|
|
eventListeners = new Array();
|
|
eventListeners = new Array();
|
|
shapePoint = new h2d.col.Point();
|
|
shapePoint = new h2d.col.Point();
|
|
@@ -206,6 +242,33 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I
|
|
function get_renderer() return ctx;
|
|
function get_renderer() return ctx;
|
|
function set_renderer(v) { ctx = v; return v; }
|
|
function set_renderer(v) { ctx = v; return v; }
|
|
|
|
|
|
|
|
+ inline function get_camera() return _cameras[0];
|
|
|
|
+
|
|
|
|
+ inline function get_cameras() return _cameras;
|
|
|
|
+
|
|
|
|
+ function set_interactiveCamera( cam : Camera ) {
|
|
|
|
+ if ( cam == null ) throw "Interactive cammera cannot be null!";
|
|
|
|
+ if ( cam.scene != this ) this.addCamera(cam);
|
|
|
|
+ return interactiveCamera = cam;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /** Adds Camera to Scene camera list with optional index at which it is added. **/
|
|
|
|
+ public function addCamera( cam : Camera, ?pos : Int ) {
|
|
|
|
+ if ( cam.scene != null )
|
|
|
|
+ cam.scene.removeCamera(cam);
|
|
|
|
+ cam.scene = this;
|
|
|
|
+ cam.posChanged = true;
|
|
|
|
+ if ( pos != null ) _cameras.insert(pos, cam);
|
|
|
|
+ else _cameras.push(cam);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /** Removes Camera from Scene camera list. Current `interactiveCamera` cannot be removed. **/
|
|
|
|
+ public function removeCamera( cam : Camera ) {
|
|
|
|
+ if ( cam == interactiveCamera ) throw "Current interactive Camera cannot be removed from camera list!";
|
|
|
|
+ cam.scene = null;
|
|
|
|
+ _cameras.remove(cam);
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
Set the fixed size for the scene, will prevent automatic scene resizing when screen size changes.
|
|
Set the fixed size for the scene, will prevent automatic scene resizing when screen size changes.
|
|
**/
|
|
**/
|
|
@@ -226,56 +289,58 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- inline function calcRatio( scale : Float ) {
|
|
|
|
- ratioX = (width * scale) / engine.width;
|
|
|
|
- ratioY = (height * scale) / engine.height;
|
|
|
|
|
|
+ inline function setViewportScale( sx : Float, sy : Float ) {
|
|
|
|
+ viewportScaleX = sx;
|
|
|
|
+ viewportScaleY = sy;
|
|
}
|
|
}
|
|
|
|
|
|
inline function calcViewport( horizontal : ScaleModeAlign, vertical : ScaleModeAlign, zoom : Float ) {
|
|
inline function calcViewport( horizontal : ScaleModeAlign, vertical : ScaleModeAlign, zoom : Float ) {
|
|
|
|
+ viewportA = (zoom * 2) / engine.width;
|
|
|
|
+ viewportD = (zoom * 2) / engine.height;
|
|
|
|
+ setViewportScale(zoom, zoom);
|
|
if ( horizontal == null ) horizontal = Center;
|
|
if ( horizontal == null ) horizontal = Center;
|
|
switch ( horizontal ) {
|
|
switch ( horizontal ) {
|
|
case Left:
|
|
case Left:
|
|
- offsetX = (engine.width - width * zoom) / (2 * zoom);
|
|
|
|
- viewportX = 0;
|
|
|
|
|
|
+ viewportX = -1;
|
|
|
|
+ offsetX = 0;
|
|
case Right:
|
|
case Right:
|
|
- offsetX = -((engine.width - width * zoom) / (2 * zoom));
|
|
|
|
- viewportX = (engine.width - width * zoom) / zoom;
|
|
|
|
|
|
+ viewportX = 1 - (width * viewportA);
|
|
|
|
+ offsetX = engine.width - width * zoom;
|
|
default:
|
|
default:
|
|
- offsetX = -(((engine.width - width * zoom) / 2) % 1.)*.5;
|
|
|
|
- viewportX = (engine.width - width * zoom) / (2 * zoom);
|
|
|
|
|
|
+ // Simple `width * viewportA - 0.5` causes gaps between tiles
|
|
|
|
+ viewportX = Math.floor((engine.width - width * zoom) / (zoom * 2)) * viewportA - 1.;
|
|
|
|
+ offsetX = Math.floor((engine.width - width * zoom) / 2);
|
|
}
|
|
}
|
|
|
|
|
|
if ( vertical == null ) vertical = Center;
|
|
if ( vertical == null ) vertical = Center;
|
|
switch ( vertical ) {
|
|
switch ( vertical ) {
|
|
case Top:
|
|
case Top:
|
|
- offsetY = (engine.height - height * zoom) / (2 * zoom);
|
|
|
|
- viewportY = 0;
|
|
|
|
|
|
+ viewportY = -1;
|
|
|
|
+ offsetY = 0;
|
|
case Bottom:
|
|
case Bottom:
|
|
- offsetY = -((engine.height - height * zoom) / (2 * zoom));
|
|
|
|
- viewportY = (engine.height - height * zoom) / zoom;
|
|
|
|
|
|
+ viewportY = 1 - (height * viewportD);
|
|
|
|
+ offsetY = engine.height - height * zoom;
|
|
default:
|
|
default:
|
|
- offsetY = -(((engine.height - height * zoom) / 2) % 1.)*.5;
|
|
|
|
- viewportY = (engine.height - height * zoom) / (2 * zoom);
|
|
|
|
|
|
+ viewportY = Math.floor((engine.height - height * zoom) / (zoom * 2)) * viewportD - 1.;
|
|
|
|
+ offsetY = Math.floor((engine.height - height * zoom) / 2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
inline function zeroViewport() {
|
|
inline function zeroViewport() {
|
|
- offsetX = 0;
|
|
|
|
- offsetY = 0;
|
|
|
|
- viewportX = 0;
|
|
|
|
- viewportY = 0;
|
|
|
|
|
|
+ viewportA = 2 / width;
|
|
|
|
+ viewportD = 2 / height;
|
|
|
|
+ viewportX = -1;
|
|
|
|
+ viewportY = -1;
|
|
}
|
|
}
|
|
|
|
|
|
switch ( scaleMode ) {
|
|
switch ( scaleMode ) {
|
|
case Resize:
|
|
case Resize:
|
|
setSceneSize(engine.width, engine.height);
|
|
setSceneSize(engine.width, engine.height);
|
|
- ratioX = 1;
|
|
|
|
- ratioY = 1;
|
|
|
|
|
|
+ setViewportScale(1, 1);
|
|
zeroViewport();
|
|
zeroViewport();
|
|
case Stretch(_width, _height):
|
|
case Stretch(_width, _height):
|
|
setSceneSize(_width, _height);
|
|
setSceneSize(_width, _height);
|
|
- ratioX = 1;
|
|
|
|
- ratioY = 1;
|
|
|
|
|
|
+ setViewportScale(engine.width / _width, engine.height / _height);
|
|
zeroViewport();
|
|
zeroViewport();
|
|
case LetterBox(_width, _height, integerScale, horizontalAlign, verticalAlign):
|
|
case LetterBox(_width, _height, integerScale, horizontalAlign, verticalAlign):
|
|
setSceneSize(_width, _height);
|
|
setSceneSize(_width, _height);
|
|
@@ -284,15 +349,13 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I
|
|
zoom = Std.int(zoom);
|
|
zoom = Std.int(zoom);
|
|
if (zoom == 0) zoom = 1;
|
|
if (zoom == 0) zoom = 1;
|
|
}
|
|
}
|
|
- calcRatio(zoom);
|
|
|
|
calcViewport(horizontalAlign, verticalAlign, zoom);
|
|
calcViewport(horizontalAlign, verticalAlign, zoom);
|
|
case Fixed(_width, _height, zoom, horizontalAlign, verticalAlign):
|
|
case Fixed(_width, _height, zoom, horizontalAlign, verticalAlign):
|
|
setSceneSize(_width, _height);
|
|
setSceneSize(_width, _height);
|
|
- calcRatio(zoom);
|
|
|
|
calcViewport(horizontalAlign, verticalAlign, zoom);
|
|
calcViewport(horizontalAlign, verticalAlign, zoom);
|
|
case Zoom(level):
|
|
case Zoom(level):
|
|
setSceneSize(Math.ceil(engine.width / level), Math.ceil(engine.height / level));
|
|
setSceneSize(Math.ceil(engine.width / level), Math.ceil(engine.height / level));
|
|
- calcRatio(level);
|
|
|
|
|
|
+ setViewportScale(level, level);
|
|
zeroViewport();
|
|
zeroViewport();
|
|
case AutoZoom(minWidth, minHeight, integerScaling):
|
|
case AutoZoom(minWidth, minHeight, integerScaling):
|
|
var zoom = Math.min(engine.width / minWidth, engine.height / minHeight);
|
|
var zoom = Math.min(engine.width / minWidth, engine.height / minHeight);
|
|
@@ -301,17 +364,17 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I
|
|
if ( zoom == 0 ) zoom = 1;
|
|
if ( zoom == 0 ) zoom = 1;
|
|
}
|
|
}
|
|
setSceneSize(Math.ceil(engine.width / zoom), Math.ceil(engine.height / zoom));
|
|
setSceneSize(Math.ceil(engine.width / zoom), Math.ceil(engine.height / zoom));
|
|
- calcRatio(zoom);
|
|
|
|
|
|
+ setViewportScale(zoom, zoom);
|
|
zeroViewport();
|
|
zeroViewport();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
inline function screenXToViewport(mx:Float) {
|
|
inline function screenXToViewport(mx:Float) {
|
|
- return mx * width / (window.width * ratioX) - viewportX;
|
|
|
|
|
|
+ return @:privateAccess interactiveCamera.screenXToCamera(window.mouseX, window.mouseY);
|
|
}
|
|
}
|
|
|
|
|
|
inline function screenYToViewport(my:Float) {
|
|
inline function screenYToViewport(my:Float) {
|
|
- return my * height / (window.height * ratioY) - viewportY;
|
|
|
|
|
|
+ return @:privateAccess interactiveCamera.screenYToCamera(window.mouseX, window.mouseY);
|
|
}
|
|
}
|
|
|
|
|
|
function get_mouseX() {
|
|
function get_mouseX() {
|
|
@@ -388,8 +451,7 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I
|
|
}
|
|
}
|
|
|
|
|
|
function screenToViewport( e : hxd.Event ) {
|
|
function screenToViewport( e : hxd.Event ) {
|
|
- e.relX = screenXToViewport(e.relX);
|
|
|
|
- e.relY = screenYToViewport(e.relY);
|
|
|
|
|
|
+ interactiveCamera.eventToCamera(e);
|
|
}
|
|
}
|
|
|
|
|
|
@:dox(hide) @:noCompletion
|
|
@:dox(hide) @:noCompletion
|
|
@@ -641,20 +703,83 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I
|
|
}
|
|
}
|
|
|
|
|
|
override function sync( ctx : RenderContext ) {
|
|
override function sync( ctx : RenderContext ) {
|
|
|
|
+ var forceCamSync = posChanged;
|
|
if( !allocated )
|
|
if( !allocated )
|
|
onAdd();
|
|
onAdd();
|
|
super.sync(ctx);
|
|
super.sync(ctx);
|
|
|
|
+ for ( cam in cameras ) cam.sync(ctx, forceCamSync);
|
|
}
|
|
}
|
|
|
|
|
|
- override function onAdd()
|
|
|
|
|
|
+ override function clipBounds(ctx:RenderContext, bounds:h2d.col.Bounds)
|
|
{
|
|
{
|
|
|
|
+ // Scene always uses whole window surface as a filter bounds as to not clip out cameras.
|
|
|
|
+ if ( rotation == 0 ) {
|
|
|
|
+ bounds.addPos(-absX, -absY);
|
|
|
|
+ bounds.addPos(window.width / matA - absX, window.height / matD - absY);
|
|
|
|
+ } else {
|
|
|
|
+ inline function calc(x:Float, y:Float) {
|
|
|
|
+ bounds.addPos(x * matA + y * matC, x * matB + y * matD);
|
|
|
|
+ }
|
|
|
|
+ var ww = window.width / matA - absX;
|
|
|
|
+ var wh = window.height / matD - absY;
|
|
|
|
+ calc(-absX, -absY);
|
|
|
|
+ calc(ww - absX, -absY);
|
|
|
|
+ calc(-absX, wh - absY);
|
|
|
|
+ calc(ww - absX, wh - absY);
|
|
|
|
+ }
|
|
|
|
+ super.clipBounds(ctx, bounds);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ override function drawContent(ctx:RenderContext)
|
|
|
|
+ {
|
|
|
|
+ if( ctx.front2back ) {
|
|
|
|
+ for ( cam in cameras ) {
|
|
|
|
+ if ( !cam.visible ) continue;
|
|
|
|
+ var i = children.length;
|
|
|
|
+ var l = layerCount;
|
|
|
|
+ cam.enter(ctx);
|
|
|
|
+ while ( l-- > 0 ) {
|
|
|
|
+ var top = l == 0 ? 0 : layersIndexes[l - 1];
|
|
|
|
+ if ( cam.layerVisible(l) ) {
|
|
|
|
+ while ( i >= top ) {
|
|
|
|
+ children[i--].drawRec(ctx);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ i = top - 1;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ cam.exit(ctx);
|
|
|
|
+ }
|
|
|
|
+ draw(ctx);
|
|
|
|
+ } else {
|
|
|
|
+ draw(ctx);
|
|
|
|
+ for ( cam in cameras ) {
|
|
|
|
+ if ( !cam.visible ) continue;
|
|
|
|
+ var i = 0;
|
|
|
|
+ var l = 0;
|
|
|
|
+ cam.enter(ctx);
|
|
|
|
+ while ( l < layerCount ) {
|
|
|
|
+ var top = layersIndexes[l++];
|
|
|
|
+ if ( cam.layerVisible(l - 1) ) {
|
|
|
|
+ while ( i < top ) {
|
|
|
|
+ children[i++].drawRec(ctx);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ i = top;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ cam.exit(ctx);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ override function onAdd() {
|
|
checkResize();
|
|
checkResize();
|
|
super.onAdd();
|
|
super.onAdd();
|
|
window.addResizeEvent(checkResize);
|
|
window.addResizeEvent(checkResize);
|
|
}
|
|
}
|
|
|
|
|
|
- override function onRemove()
|
|
|
|
- {
|
|
|
|
|
|
+ override function onRemove() {
|
|
super.onRemove();
|
|
super.onRemove();
|
|
window.removeResizeEvent(checkResize);
|
|
window.removeResizeEvent(checkResize);
|
|
}
|
|
}
|
|
@@ -673,26 +798,21 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I
|
|
|
|
|
|
var tex = target.getTexture();
|
|
var tex = target.getTexture();
|
|
engine.pushTarget(tex);
|
|
engine.pushTarget(tex);
|
|
- var ow = width, oh = height, ox = offsetX, oy = offsetY;
|
|
|
|
- var ovx = viewportX, ovy = viewportY, orx = ratioX, ory = ratioY;
|
|
|
|
|
|
+ var ow = width, oh = height, ova = viewportA, ovd = viewportD, ovx = viewportX, ovy = viewportY;
|
|
width = tex.width;
|
|
width = tex.width;
|
|
height = tex.height;
|
|
height = tex.height;
|
|
- ratioX = 1;
|
|
|
|
- ratioY = 1;
|
|
|
|
- offsetX = 0;
|
|
|
|
- offsetY = 0;
|
|
|
|
- viewportX = 0;
|
|
|
|
- viewportY = 0;
|
|
|
|
|
|
+ viewportA = 2 / width;
|
|
|
|
+ viewportD = 2 / height;
|
|
|
|
+ viewportX = -1;
|
|
|
|
+ viewportY = -1;
|
|
posChanged = true;
|
|
posChanged = true;
|
|
render(engine);
|
|
render(engine);
|
|
engine.popTarget();
|
|
engine.popTarget();
|
|
|
|
|
|
width = ow;
|
|
width = ow;
|
|
height = oh;
|
|
height = oh;
|
|
- ratioX = orx;
|
|
|
|
- ratioY = ory;
|
|
|
|
- offsetX = ox;
|
|
|
|
- offsetY = oy;
|
|
|
|
|
|
+ viewportA = ova;
|
|
|
|
+ viewportD = ovd;
|
|
viewportX = ovx;
|
|
viewportX = ovx;
|
|
viewportY = ovy;
|
|
viewportY = ovy;
|
|
posChanged = true;
|
|
posChanged = true;
|