fix syntax
This commit is contained in:
241
film2d.cm
241
film2d.cm
@@ -64,9 +64,9 @@ function _resolve_sprite_fit(sprite) {
|
||||
return sprite
|
||||
}
|
||||
|
||||
var scale = null
|
||||
if (fit == 'contain') {
|
||||
// Fit inside box, preserve aspect (letterbox)
|
||||
var scale
|
||||
if (tex_aspect > box_aspect) {
|
||||
// Image wider than box - constrain by width
|
||||
scale = target_w / tex_w
|
||||
@@ -79,24 +79,35 @@ function _resolve_sprite_fit(sprite) {
|
||||
return sprite
|
||||
}
|
||||
|
||||
var cover_scale = null
|
||||
var fit_ax = null
|
||||
var fit_ay = null
|
||||
var scale_w = null
|
||||
var scale_h = null
|
||||
var visible_w = null
|
||||
var visible_h = null
|
||||
var uv_w = null
|
||||
var uv_h = null
|
||||
var uv_x = null
|
||||
var uv_y = null
|
||||
if (fit == 'cover') {
|
||||
// Fill box, preserve aspect (crop via UV)
|
||||
var fit_ax = sprite.fit_anchor_x != null ? sprite.fit_anchor_x : 0.5
|
||||
var fit_ay = sprite.fit_anchor_y != null ? sprite.fit_anchor_y : 0.5
|
||||
|
||||
var scale_w = target_w / tex_w
|
||||
var scale_h = target_h / tex_h
|
||||
var scale = max(scale_w, scale_h)
|
||||
fit_ax = sprite.fit_anchor_x != null ? sprite.fit_anchor_x : 0.5
|
||||
fit_ay = sprite.fit_anchor_y != null ? sprite.fit_anchor_y : 0.5
|
||||
|
||||
scale_w = target_w / tex_w
|
||||
scale_h = target_h / tex_h
|
||||
cover_scale = max(scale_w, scale_h)
|
||||
|
||||
// Compute visible portion of texture in UV space
|
||||
var visible_w = target_w / scale
|
||||
var visible_h = target_h / scale
|
||||
|
||||
visible_w = target_w / cover_scale
|
||||
visible_h = target_h / cover_scale
|
||||
|
||||
// UV rect (0-1 space)
|
||||
var uv_w = visible_w / tex_w
|
||||
var uv_h = visible_h / tex_h
|
||||
var uv_x = (1 - uv_w) * fit_ax
|
||||
var uv_y = (1 - uv_h) * fit_ay
|
||||
uv_w = visible_w / tex_w
|
||||
uv_h = visible_h / tex_h
|
||||
uv_x = (1 - uv_w) * fit_ax
|
||||
uv_y = (1 - uv_h) * fit_ay
|
||||
|
||||
sprite.width = target_w
|
||||
sprite.height = target_h
|
||||
@@ -122,12 +133,14 @@ film2d.register = function(drawable) {
|
||||
|
||||
// Index by groups (effect routing only)
|
||||
var groups = drawable.groups || []
|
||||
for (var i = 0; i < length(groups); i++) {
|
||||
var g = groups[i]
|
||||
var i = 0
|
||||
var g = null
|
||||
for (i = 0; i < length(groups); i++) {
|
||||
g = groups[i]
|
||||
if (!group_index[g]) group_index[g] = []
|
||||
push(group_index[g], id)
|
||||
}
|
||||
|
||||
|
||||
return id
|
||||
}
|
||||
|
||||
@@ -135,21 +148,24 @@ film2d.unregister = function(id) {
|
||||
var id_str = text(id)
|
||||
var drawable = registry[id_str]
|
||||
if (!drawable) return
|
||||
|
||||
|
||||
// Remove from plane index
|
||||
var plane = drawable.plane || 'default'
|
||||
var idx = null
|
||||
if (plane_index[plane]) {
|
||||
var idx = find(plane_index[plane], id_str)
|
||||
idx = find(plane_index[plane], id_str)
|
||||
if (idx != null)
|
||||
plane_index[plane] = array(array(plane_index[plane], 0, idx), array(plane_index[plane], idx+1))
|
||||
}
|
||||
|
||||
|
||||
// Remove from group indices
|
||||
var groups = drawable.groups || []
|
||||
for (var i = 0; i < length(groups); i++) {
|
||||
var g = groups[i]
|
||||
var i = 0
|
||||
var g = null
|
||||
for (i = 0; i < length(groups); i++) {
|
||||
g = groups[i]
|
||||
if (group_index[g]) {
|
||||
var idx = find(group_index[g], id_str)
|
||||
idx = find(group_index[g], id_str)
|
||||
if (idx != null)
|
||||
group_index[g] = array(array(group_index[g], 0, idx), array(group_index[g], idx+1))
|
||||
}
|
||||
@@ -172,9 +188,10 @@ film2d.unindex_group = function(id, group) {
|
||||
}
|
||||
|
||||
film2d.reindex = function(id, old_groups, new_groups) {
|
||||
for (var i = 0; i < length(old_groups); i++)
|
||||
var i = 0
|
||||
for (i = 0; i < length(old_groups); i++)
|
||||
film2d.unindex_group(id, old_groups[i])
|
||||
for (var i = 0; i < length(new_groups); i++)
|
||||
for (i = 0; i < length(new_groups); i++)
|
||||
film2d.index_group(id, new_groups[i])
|
||||
}
|
||||
|
||||
@@ -185,16 +202,22 @@ film2d.get = function(id) {
|
||||
// Query by plane and/or group - returns array of drawables
|
||||
film2d.query = function(selector) {
|
||||
var result = []
|
||||
|
||||
var ids = null
|
||||
var i = 0
|
||||
var d = null
|
||||
var groups = null
|
||||
var seen = null
|
||||
var g = 0
|
||||
|
||||
// Query by plane (primary selection)
|
||||
if (selector.plane) {
|
||||
var ids = plane_index[selector.plane] || []
|
||||
for (var i = 0; i < length(ids); i++) {
|
||||
var d = registry[ids[i]]
|
||||
ids = plane_index[selector.plane] || []
|
||||
for (i = 0; i < length(ids); i++) {
|
||||
d = registry[ids[i]]
|
||||
if (d && d.visible != false) {
|
||||
// If also filtering by group, check membership
|
||||
if (selector.group) {
|
||||
var groups = d.groups || []
|
||||
groups = d.groups || []
|
||||
if (search(groups, selector.group) != null) push(result, d)
|
||||
} else {
|
||||
push(result, d)
|
||||
@@ -203,32 +226,32 @@ film2d.query = function(selector) {
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
|
||||
// Query by group only (for effect routing)
|
||||
if (selector.group) {
|
||||
var ids = group_index[selector.group] || []
|
||||
for (var i = 0; i < length(ids); i++) {
|
||||
var d = registry[ids[i]]
|
||||
ids = group_index[selector.group] || []
|
||||
for (i = 0; i < length(ids); i++) {
|
||||
d = registry[ids[i]]
|
||||
if (d && d.visible != false) push(result, d)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
|
||||
if (selector.groups) {
|
||||
var seen = {}
|
||||
for (var g = 0; g < length(selector.groups); g++) {
|
||||
var ids = group_index[selector.groups[g]] || []
|
||||
for (var i = 0; i < length(ids); i++) {
|
||||
seen = {}
|
||||
for (g = 0; g < length(selector.groups); g++) {
|
||||
ids = group_index[selector.groups[g]] || []
|
||||
for (i = 0; i < length(ids); i++) {
|
||||
if (!seen[ids[i]]) {
|
||||
seen[ids[i]] = true
|
||||
var d = registry[ids[i]]
|
||||
d = registry[ids[i]]
|
||||
if (d && d.visible != false) push(result, d)
|
||||
}
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
|
||||
// All drawables
|
||||
var draws = array(registry, id => registry[id])
|
||||
result = array(result, filter(draws, d => d.visible != false))
|
||||
@@ -277,10 +300,14 @@ film2d.render = function(params, render_backend) {
|
||||
|
||||
// Bucket drawables by layer
|
||||
var buckets = {}
|
||||
for (var i = 0; i < length(drawables); i++) {
|
||||
var d = drawables[i]
|
||||
var layer_key = text(d.layer)
|
||||
var b = buckets[layer_key]
|
||||
var i = 0
|
||||
var d = null
|
||||
var layer_key = null
|
||||
var b = null
|
||||
for (i = 0; i < length(drawables); i++) {
|
||||
d = drawables[i]
|
||||
layer_key = text(d.layer)
|
||||
b = buckets[layer_key]
|
||||
if (!b) {
|
||||
b = []
|
||||
buckets[layer_key] = b
|
||||
@@ -296,19 +323,23 @@ film2d.render = function(params, render_backend) {
|
||||
// Merge buckets, y-sorting buckets that request it
|
||||
var y_down = camera && camera.y_down == true
|
||||
var sorted_drawables = []
|
||||
var li = 0
|
||||
var mode = null
|
||||
var keys = null
|
||||
var j = 0
|
||||
|
||||
for (var li = 0; li < length(layers); li++) {
|
||||
var layer_key = layers[li]
|
||||
var b = buckets[layer_key]
|
||||
for (li = 0; li < length(layers); li++) {
|
||||
layer_key = layers[li]
|
||||
b = buckets[layer_key]
|
||||
|
||||
var mode = layer_sort[layer_key] || "explicit"
|
||||
mode = layer_sort[layer_key] || "explicit"
|
||||
if (mode == "y") {
|
||||
var keys = array(b, d => _y_sort_key(d))
|
||||
keys = array(b, d => _y_sort_key(d))
|
||||
b = sort(b, keys) // ascending feet-y
|
||||
if (!y_down) b = reverse(b) // y_up => smaller y draws later => reverse
|
||||
}
|
||||
|
||||
for (var j = 0; j < length(b); j++) push(sorted_drawables, b[j])
|
||||
for (j = 0; j < length(b); j++) push(sorted_drawables, b[j])
|
||||
}
|
||||
|
||||
drawables = sorted_drawables
|
||||
@@ -318,9 +349,10 @@ film2d.render = function(params, render_backend) {
|
||||
push(commands, { cmd: "set_camera", camera: camera })
|
||||
|
||||
var batches = _batch_drawables(drawables)
|
||||
var batch = null
|
||||
|
||||
for (var i = 0; i < length(batches); i++) {
|
||||
var batch = batches[i]
|
||||
for (i = 0; i < length(batches); i++) {
|
||||
batch = batches[i]
|
||||
if (batch.type == "sprite_batch")
|
||||
push(commands, { cmd: "draw_batch", batch_type: "sprites", geometry: { sprites: batch.sprites }, texture: batch.texture, material: batch.material })
|
||||
else if (batch.type == "mesh2d_batch")
|
||||
@@ -341,17 +373,40 @@ function _batch_drawables(drawables) {
|
||||
var batches = []
|
||||
var current = null
|
||||
var default_mat = {blend: 'alpha', sampler: 'nearest'}
|
||||
|
||||
for (var i = 0; i < length(drawables); i++) {
|
||||
var d = drawables[i]
|
||||
|
||||
var i = 0
|
||||
var d = null
|
||||
var tex = null
|
||||
var mat = null
|
||||
var particles = null
|
||||
var emitter_opacity = 0
|
||||
var emitter_tint = null
|
||||
var p = 0
|
||||
var part = null
|
||||
var pc = null
|
||||
var sprite = null
|
||||
var tiles = null
|
||||
var tile_w = 0
|
||||
var tile_h = 0
|
||||
var off_x = 0
|
||||
var off_y = 0
|
||||
var tilemap_opacity = 0
|
||||
var tilemap_tint = null
|
||||
var x = 0
|
||||
var y = 0
|
||||
var img = null
|
||||
var wx = 0
|
||||
var wy = 0
|
||||
|
||||
for (i = 0; i < length(drawables); i++) {
|
||||
d = drawables[i]
|
||||
|
||||
if (d.type == 'sprite') {
|
||||
// Resolve fit mode (computes final width/height/uv_rect)
|
||||
_resolve_sprite_fit(d)
|
||||
|
||||
var tex = d.texture || d.image
|
||||
var mat = d.material || {blend: 'alpha', sampler: d.filter || 'nearest'}
|
||||
|
||||
|
||||
tex = d.texture || d.image
|
||||
mat = d.material || {blend: 'alpha', sampler: d.filter || 'nearest'}
|
||||
|
||||
if (current && current.type == 'sprite_batch' && current.texture == tex && _mat_eq(current.material, mat)) {
|
||||
push(current.sprites, d)
|
||||
} else {
|
||||
@@ -360,16 +415,16 @@ function _batch_drawables(drawables) {
|
||||
}
|
||||
} else if (d.type == 'particles') {
|
||||
// Convert particles to sprites
|
||||
var tex = d.texture || d.image
|
||||
var mat = d.material || default_mat
|
||||
var particles = d.particles || []
|
||||
var emitter_opacity = d.opacity != null ? d.opacity : 1
|
||||
var emitter_tint = d.tint || {r: 1, g: 1, b: 1, a: 1}
|
||||
|
||||
for (var p = 0; p < length(particles); p++) {
|
||||
var part = particles[p]
|
||||
var pc = part.color || {r: 1, g: 1, b: 1, a: 1}
|
||||
var sprite = {
|
||||
tex = d.texture || d.image
|
||||
mat = d.material || default_mat
|
||||
particles = d.particles || []
|
||||
emitter_opacity = d.opacity != null ? d.opacity : 1
|
||||
emitter_tint = d.tint || {r: 1, g: 1, b: 1, a: 1}
|
||||
|
||||
for (p = 0; p < length(particles); p++) {
|
||||
part = particles[p]
|
||||
pc = part.color || {r: 1, g: 1, b: 1, a: 1}
|
||||
sprite = {
|
||||
type: 'sprite',
|
||||
pos: part.pos,
|
||||
width: (d.width || 16) * (part.scale || 1),
|
||||
@@ -380,7 +435,7 @@ function _batch_drawables(drawables) {
|
||||
opacity: emitter_opacity,
|
||||
tint: emitter_tint
|
||||
}
|
||||
|
||||
|
||||
if (current && current.type == 'sprite_batch' && current.texture == tex && _mat_eq(current.material, mat)) {
|
||||
push(current.sprites, sprite)
|
||||
} else {
|
||||
@@ -390,25 +445,25 @@ function _batch_drawables(drawables) {
|
||||
}
|
||||
} else if (d.type == 'tilemap') {
|
||||
// Expand tilemap to sprites
|
||||
var tiles = d.tiles || []
|
||||
var tile_w = d.tile_width || 1
|
||||
var tile_h = d.tile_height || 1
|
||||
var off_x = d.offset_x || 0
|
||||
var off_y = d.offset_y || 0
|
||||
var tilemap_opacity = d.opacity != null ? d.opacity : 1
|
||||
var tilemap_tint = d.tint || {r: 1, g: 1, b: 1, a: 1}
|
||||
|
||||
for (var x = 0; x < length(tiles); x++) {
|
||||
tiles = d.tiles || []
|
||||
tile_w = d.tile_width || 1
|
||||
tile_h = d.tile_height || 1
|
||||
off_x = d.offset_x || 0
|
||||
off_y = d.offset_y || 0
|
||||
tilemap_opacity = d.opacity != null ? d.opacity : 1
|
||||
tilemap_tint = d.tint || {r: 1, g: 1, b: 1, a: 1}
|
||||
|
||||
for (x = 0; x < length(tiles); x++) {
|
||||
if (!tiles[x]) continue
|
||||
for (var y = 0; y < length(tiles[x]); y++) {
|
||||
var img = tiles[x][y]
|
||||
for (y = 0; y < length(tiles[x]); y++) {
|
||||
img = tiles[x][y]
|
||||
if (!img) continue
|
||||
|
||||
var wx = (x + off_x) * tile_w
|
||||
var wy = (y + off_y) * tile_h
|
||||
|
||||
|
||||
wx = (x + off_x) * tile_w
|
||||
wy = (y + off_y) * tile_h
|
||||
|
||||
// Center anchor for sprite
|
||||
var sprite = {
|
||||
sprite = {
|
||||
type: 'sprite',
|
||||
image: img,
|
||||
pos: {x: wx + tile_w/2, y: wy + tile_h/2},
|
||||
@@ -420,10 +475,10 @@ function _batch_drawables(drawables) {
|
||||
opacity: tilemap_opacity,
|
||||
tint: tilemap_tint
|
||||
}
|
||||
|
||||
|
||||
// Batching
|
||||
var tex = img
|
||||
var mat = default_mat
|
||||
tex = img
|
||||
mat = default_mat
|
||||
if (current && current.type == 'sprite_batch' && current.texture == tex && _mat_eq(current.material, mat)) {
|
||||
push(current.sprites, sprite)
|
||||
} else {
|
||||
@@ -434,8 +489,8 @@ function _batch_drawables(drawables) {
|
||||
}
|
||||
} else if (d.type == 'mesh2d') {
|
||||
// Mesh2d drawables - arbitrary triangle meshes (for lines, ropes, etc)
|
||||
var tex = d.texture || d.image
|
||||
var mat = d.material || {blend: d.blend || 'alpha', sampler: d.filter || 'linear'}
|
||||
tex = d.texture || d.image
|
||||
mat = d.material || {blend: d.blend || 'alpha', sampler: d.filter || 'linear'}
|
||||
|
||||
if (current && current.type == 'mesh2d_batch' && current.texture == tex && _mat_eq(current.material, mat)) {
|
||||
push(current.meshes, d)
|
||||
|
||||
Reference in New Issue
Block a user