Files
prosperon/shape2d.cm
2026-01-16 20:56:16 -06:00

131 lines
2.5 KiB
Plaintext

var film2d = use('film2d')
var shape_proto = {
type: 'shape',
set_pos: function(x, y) {
this.pos.x = x
this.pos.y = y
return this
},
destroy: function() {
film2d.unregister(this._id)
}
}
var defaults = {
type: 'shape',
shape_type: 'rect', // 'rect', 'circle', 'ellipse', 'pill'
// routing
plane: 'default',
layer: 0,
groups: [],
visible: true,
// transform
pos: {x: 0, y: 0},
anchor_x: 0.5,
anchor_y: 0.5,
rotation: 0,
// geometry
width: 100,
height: 100,
// corner / radius controls (rect/pill)
radius: 0,
corner_style: 'round', // 'round', 'bevel', 'scoop', 'notch', 'square'
// edge / coverage
feather: 0,
stroke_thickness: 0,
stroke_align: 'center', // 'inside', 'center', 'outside'
// dashed stroke
dash_len: 0,
gap_len: 0,
dash_offset: 0,
cap: 'butt', // 'butt', 'square', 'round'
join: 'miter', // 'miter', 'bevel', 'round'
miter_limit: 4,
// fill/stroke colors
fill: {r: 1, g: 1, b: 1, a: 1},
stroke: {r: 0, g: 0, b: 0, a: 0},
// blending
blend: 'alpha', // 'alpha', 'add', 'mul', 'screen'
opacity: 1,
// texture fill
fill_tex: null,
uv: {
space: 'local', // 'local', 'screen'
scale: {x: 1, y: 1},
offset: {x: 0, y: 0},
rotate: 0
},
sampler: null
}
function make_shape(shape_type, props) {
var data = {}
for (var k in defaults) {
var v = defaults[k]
if (is_object(v) && !is_array(v)) {
data[k] = {}
for (var kk in v) data[k][kk] = v[kk]
} else {
data[k] = v
}
}
data.shape_type = shape_type
// Apply user props (deep merge for objects)
for (var k in props) {
var v = props[k]
if (is_object(v) && !is_array(v) && is_object(data[k])) {
for (var kk in v) data[k][kk] = v[kk]
} else {
data[k] = v
}
}
// Ensure groups is array
if (!data.groups) data.groups = []
if (is_text(data.groups)) data.groups = [data.groups]
var s = meme(shape_proto, data)
film2d.register(s)
return s
}
var shape2d = {
rect: function(props) {
return make_shape('rect', props)
},
circle: function(props) {
// For circle, width == height == diameter
var p = props || {}
if (p.radius != null && p.width == null) {
p.width = p.radius * 2
p.height = p.radius * 2
}
return make_shape('circle', p)
},
ellipse: function(props) {
return make_shape('ellipse', props)
},
pill: function(props) {
return make_shape('pill', props)
}
}
return shape2d