110 lines
2.0 KiB
Plaintext
110 lines
2.0 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 = object(defaults, props)
|
|
|
|
// 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
|