lingmodeler
↓ 0 downloadsLingModeler: box modeling with quads and tris, rigging + weight painting, 2D vector illustration and animation, procedural textures and game assets; .lmesh / .ling native formats, OBJ, glTF and SVG import / export
Keywords 3d, modeling, vector, svg, gltf, obj, rigging, animation, textures, ling
lingfu install lingmodelerCode / Files (67)
examples/shapes.ling
# LingModeler vector document (.ling) - valid Ling source. `use` it and call draw_drawing(ox, oy, scale).
# Paths: 6 numbers per node (x y, in-handle x y, out-handle x y). Also the intermediary for SVG import / export.
fn lv_format() { return "lingvec" }
fn lv_version() { return 1 }
fn lv_name() { return "drawing" }
fn lv_size() { return lm_nums("512,512,16777215") }
fn lv_timeline() { return lm_nums("0,24,24") }
fn lv_layers() { return lm_strs("Layer 1") }
fn lv_layer_vis() { return lm_nums("1") }
fn lv_layer_lock() { return lm_nums("0") }
fn lv_item_count() { return 4 }
fn lv_i0_kind() { return "rect" }
fn lv_i0_name() { return "rect 1" }
fn lv_i0_style() { return lm_nums("0,1,3910379,1316896,3,1,0") }
fn lv_i0_xf() { return lm_nums("0,0,0,1,1") }
fn lv_i0_pts() { return lm_nums("60,60,60,60,60,60,220,60,220,60,220,60,220,180,220,180,220,180,60,180,60,180,60,180") }
fn lv_i0_flat() { return lm_nums("60,60,220,60,220,180,60,180") }
fn lv_i0_keys() { return lm_nums("") }
fn lv_i0_skf() { return lm_nums("") }
fn lv_i1_kind() { return "ellipse" }
fn lv_i1_name() { return "ellipse 2" }
fn lv_i1_style() { return lm_nums("0,1,16225310,1316896,3,1,0") }
fn lv_i1_xf() { return lm_nums("0,0,0,1,1") }
fn lv_i1_pts() { return lm_nums("420,140,420,101.340071,420,178.659929,330,210,379.705623,210,280.294377,210,240,140,240,178.659929,240,101.340071,330,70,280.294377,70,379.705623,70") }
fn lv_i1_flat() { return lm_nums("420,140,419.882893,143.60219,419.53534,147.157093,418.962998,150.660309,418.17152,154.107441,417.166561,157.494089,415.953778,160.815857,414.538823,164.068346,412.927353,167.247158,411.125022,170.347893,409.137485,173.366155,406.970397,176.297545,404.629412,179.137664,402.120186,181.882115,399.448374,184.526499,396.61963,187.066418,393.639609,189.497473,390.513966,191.815267,387.248356,194.015402,383.848433,196.093478,380.319854,198.045098,376.668272,199.865864,372.899342,201.551377,369.01872,203.097239,365.03206,204.499053,360.945017,205.752418,356.763245,206.852938,352.492401,207.796214,348.138138,208.577849,343.706111,209.193443,339.201976,209.638598,334.631388,209.908916,330,210,325.368612,209.908916,320.798024,209.638598,316.293889,209.193443,311.861862,208.577849,307.507599,207.796214,303.236755,206.852938,299.054983,205.752418,294.96794,204.499053,290.98128,203.097239,287.100658,201.551377,283.331728,199.865864,279.680146,198.045098,276.151567,196.093478,272.751644,194.015402,269.486034,191.815267,266.360391,189.497473,263.38037,187.066418,260.551626,184.526499,257.879814,181.882115,255.370588,179.137664,253.029603,176.297545,250.862515,173.366155,248.874978,170.347893,247.072647,167.247158,245.461177,164.068346,244.046222,160.815857,242.833439,157.494089,241.82848,154.107441,241.037002,150.660309,240.46466,147.157093,240.117107,143.60219,240,140,240.117107,136.39781,240.46466,132.842907,241.037002,129.339691,241.82848,125.892559,242.833439,122.505911,244.046222,119.184143,245.461177,115.931654,247.072647,112.752842,248.874978,109.652107,250.862515,106.633845,253.029603,103.702455,255.370588,100.862336,257.879814,98.117885,260.551626,95.473501,263.38037,92.933582,266.360391,90.502527,269.486034,88.184733,272.751644,85.984598,276.151567,83.906522,279.680146,81.954902,283.331728,80.134136,287.100658,78.448623,290.98128,76.902761,294.96794,75.500947,299.054983,74.247582,303.236755,73.147062,307.507599,72.203786,311.861862,71.422151,316.293889,70.806557,320.798024,70.361402,325.368612,70.091084,330,70,334.631388,70.091084,339.201976,70.361402,343.706111,70.806557,348.138138,71.422151,352.492401,72.203786,356.763245,73.147062,360.945017,74.247582,365.03206,75.500947,369.01872,76.902761,372.899342,78.448623,376.668272,80.134136,380.319854,81.954902,383.848433,83.906522,387.248356,85.984598,390.513966,88.184733,393.639609,90.502527,396.61963,92.933582,399.448374,95.473501,402.120186,98.117885,404.629412,100.862336,406.970397,103.702455,409.137485,106.633845,411.125022,109.652107,412.927353,112.752842,414.538823,115.931654,415.953778,119.184143,417.166561,122.505911,418.17152,125.892559,418.962998,129.339691,419.53534,132.842907,419.882893,136.39781") }
fn lv_i1_keys() { return lm_nums("") }
fn lv_i1_skf() { return lm_nums("") }
fn lv_i2_kind() { return "star" }
fn lv_i2_name() { return "star 3" }
fn lv_i2_style() { return lm_nums("0,1,16242758,1316896,6,1,0") }
fn lv_i2_xf() { return lm_nums("40,0,0.6,1,1") }
fn lv_i2_pts() { return lm_nums("256,230,256,230,256,230,285.09537,299.953659,285.09537,299.953659,285.09537,299.953659,360.616217,306.008131,360.616217,306.008131,360.616217,306.008131,303.077298,355.296341,303.077298,355.296341,303.077298,355.296341,320.656378,428.991869,320.656378,428.991869,320.656378,428.991869,256,389.5,256,389.5,256,389.5,191.343622,428.991869,191.343622,428.991869,191.343622,428.991869,208.922702,355.296341,208.922702,355.296341,208.922702,355.296341,151.383783,306.008131,151.383783,306.008131,151.383783,306.008131,226.90463,299.953659,226.90463,299.953659,226.90463,299.953659") }
fn lv_i2_flat() { return lm_nums("352.179631,247.378396,336.694269,321.542124,395.605701,369.181373,320.286565,377.371771,293.183581,448.12121,262.119156,379.019427,186.457158,375.105736,242.577424,324.208087,222.918722,251.039854,288.667379,288.685161") }
fn lv_i2_keys() { return lm_nums("0,0,0,1,0,0,2,0,0,3,0,1,4,0,1,5,0,1,0,24,80,1,24,0,2,24,1.2,3,24,1,4,24,1,5,24,1") }
fn lv_i2_skf() { return lm_nums("") }
fn lv_i3_kind() { return "path" }
fn lv_i3_name() { return "path 4" }
fn lv_i3_style() { return lm_nums("0,0,-1,10114006,5,1,0") }
fn lv_i3_xf() { return lm_nums("0,0,0,1,1") }
fn lv_i3_pts() { return lm_nums("60,450,60,450,160,380,450,450,350,520,450,450") }
fn lv_i3_flat() { return lm_nums("60,450,69.633179,444.039917,79.760742,439.233398,90.349731,435.50354,101.367188,432.773438,112.780151,430.966187,124.555664,430.004883,136.660767,429.812622,149.0625,430.3125,161.727905,431.427612,174.624023,433.081055,187.717896,435.195923,200.976563,437.695313,214.367065,440.502319,227.856445,443.540039,241.411743,446.731567,255,450,268.588257,453.268433,282.143555,456.459961,295.632935,459.497681,309.023438,462.304688,322.282104,464.804077,335.375977,466.918945,348.272095,468.572388,360.9375,469.6875,373.339233,470.187378,385.444336,469.995117,397.219849,469.033813,408.632813,467.226563,419.650269,464.49646,430.239258,460.766602,440.366821,455.960083,450,450") }
fn lv_i3_keys() { return lm_nums("") }
fn lv_i3_skf() { return lm_nums("") }
# helpers (decode the packed lists)
fn lm_nums(s) {
bind out = list_new()
if s == "" { return out }
bind parts = str_split(s, ",")
bind i = 0.0
while i < len(parts) { bind out = list_push(out, to_number(list_get(parts, i))) bind i = i + 1.0 }
return out
}
fn lm_strs(s) {
if s == "" { return list_new() }
return str_split(s, "|")
}
# draw one flattened item at (ox, oy) scaled: filled polygon + outline (ling's draw_poly / draw_line)
fn lvec_draw_item(flat, style, ox, oy, s) {
bind n = floor(len(flat) / 2.0)
if n < 2.0 { return 0.0 }
bind pts = list_new()
bind i = 0.0
while i < n { bind pts = list_push(pts, ox + list_get(flat, i * 2.0) * s) bind pts = list_push(pts, oy + list_get(flat, i * 2.0 + 1.0) * s) bind i = i + 1.0 }
bind fill = list_get(style, 2)
bind stroke = list_get(style, 3)
if list_get(style, 1) > 0.5 { if fill >= 0.0 { set_color(floor(fill / 65536.0), floor(fill / 256.0) % 256.0, fill % 256.0) draw_poly(pts) } }
if stroke >= 0.0 {
set_color(floor(stroke / 65536.0), floor(stroke / 256.0) % 256.0, stroke % 256.0)
bind segs = n - 1.0
if list_get(style, 1) > 0.5 { bind segs = n }
bind i = 0.0
while i < segs { bind j = (i + 1.0) % n draw_line(list_get(pts, i * 2.0), list_get(pts, i * 2.0 + 1.0), list_get(pts, j * 2.0), list_get(pts, j * 2.0 + 1.0)) bind i = i + 1.0 }
}
}
fn draw_drawing(ox, oy, s) {
lvec_draw_item(lv_i0_flat(), lv_i0_style(), ox, oy, s)
lvec_draw_item(lv_i1_flat(), lv_i1_style(), ox, oy, s)
lvec_draw_item(lv_i2_flat(), lv_i2_style(), ox, oy, s)
lvec_draw_item(lv_i3_flat(), lv_i3_style(), ox, oy, s)
}