3D image transform node.

This commit is contained in:
Tanasart 2023-11-16 20:22:38 +07:00
parent d5f1a61a6c
commit 97c2915406
15 changed files with 296 additions and 34 deletions

View file

@ -96,12 +96,12 @@
{"name":"3D","order":20,"path":"folders/nodes/data/3D.yy",},
{"name":"primitive","order":9,"path":"folders/nodes/data/3D/__legacy/primitive.yy",},
{"name":"2d effects","order":1,"path":"folders/nodes/data/3D/2d effects.yy",},
{"name":"d3d camera","order":12,"path":"folders/nodes/data/3D/d3d camera.yy",},
{"name":"d3d compose","order":8,"path":"folders/nodes/data/3D/d3d compose.yy",},
{"name":"d3d light","order":6,"path":"folders/nodes/data/3D/d3d light.yy",},
{"name":"d3d mesh","order":4,"path":"folders/nodes/data/3D/d3d mesh.yy",},
{"name":"d3d modifier","order":9,"path":"folders/nodes/data/3D/d3d modifier.yy",},
{"name":"d3d particle","order":10,"path":"folders/nodes/data/3D/d3d particle.yy",},
{"name":"d3d camera","order":11,"path":"folders/nodes/data/3D/d3d camera.yy",},
{"name":"d3d compose","order":7,"path":"folders/nodes/data/3D/d3d compose.yy",},
{"name":"d3d light","order":5,"path":"folders/nodes/data/3D/d3d light.yy",},
{"name":"d3d mesh","order":3,"path":"folders/nodes/data/3D/d3d mesh.yy",},
{"name":"d3d modifier","order":8,"path":"folders/nodes/data/3D/d3d modifier.yy",},
{"name":"d3d particle","order":9,"path":"folders/nodes/data/3D/d3d particle.yy",},
{"name":"animation","order":6,"path":"folders/nodes/data/animation.yy",},
{"name":"compose","order":11,"path":"folders/nodes/data/compose.yy",},
{"name":"armature","order":3,"path":"folders/nodes/data/compose/armature.yy",},
@ -274,7 +274,7 @@
{"name":"__node_process_template","order":18,"path":"scripts/__node_process_template/__node_process_template.yy",},
{"name":"__node_3d_obj","order":4,"path":"scripts/__node_3d_obj/__node_3d_obj.yy",},
{"name":"__path","order":1,"path":"scripts/__path/__path.yy",},
{"name":"node_3d_point_affector","order":11,"path":"scripts/node_3d_point_affector/node_3d_point_affector.yy",},
{"name":"node_3d_point_affector","order":10,"path":"scripts/node_3d_point_affector/node_3d_point_affector.yy",},
{"name":"draw_text_path","order":25,"path":"scripts/draw_text_path/draw_text_path.yy",},
{"name":"sh_brush_outline","order":7,"path":"shaders/sh_brush_outline/sh_brush_outline.yy",},
{"name":"s_node_grid_tri_noise","order":22,"path":"sprites/s_node_grid_tri_noise/s_node_grid_tri_noise.yy",},
@ -483,7 +483,7 @@
{"name":"byte_writer","order":8,"path":"scripts/byte_writer/byte_writer.yy",},
{"name":"checkboxGroup","order":28,"path":"scripts/checkboxGroup/checkboxGroup.yy",},
{"name":"node_FXAA","order":8,"path":"scripts/node_FXAA/node_FXAA.yy",},
{"name":"__node_3d_object","order":5,"path":"scripts/__node_3d_object/__node_3d_object.yy",},
{"name":"__node_3d_object","order":4,"path":"scripts/__node_3d_object/__node_3d_object.yy",},
{"name":"s_node_pixel_find","order":13,"path":"sprites/s_node_pixel_find/s_node_pixel_find.yy",},
{"name":"s_biterator_canvas_cover","order":16,"path":"sprites/s_biterator_canvas_cover/s_biterator_canvas_cover.yy",},
{"name":"sh_noise_grid_tri","order":3,"path":"shaders/sh_noise_grid_tri/sh_noise_grid_tri.yy",},
@ -501,6 +501,7 @@
{"name":"s_node_HSV_combine","order":44,"path":"sprites/s_node_HSV_combine/s_node_HSV_combine.yy",},
{"name":"Obj_FirebaseFirestore_Collection_Query_GreaterEqual","order":5,"path":"objects/Obj_FirebaseFirestore_Collection_Query_GreaterEqual/Obj_FirebaseFirestore_Collection_Query_GreaterEqual.yy",},
{"name":"s_node_pb_box_contract","order":25,"path":"sprites/s_node_pb_box_contract/s_node_pb_box_contract.yy",},
{"name":"s_node_image_transform_3d","order":25,"path":"sprites/s_node_image_transform_3d/s_node_image_transform_3d.yy",},
{"name":"node_normal_light","order":2,"path":"scripts/node_normal_light/node_normal_light.yy",},
{"name":"o_dialog_release_note","order":8,"path":"objects/o_dialog_release_note/o_dialog_release_note.yy",},
{"name":"sh_fd_advect_material_rgba_16_glsl","order":4,"path":"shaders/sh_fd_advect_material_rgba_16_glsl/sh_fd_advect_material_rgba_16_glsl.yy",},
@ -785,7 +786,7 @@
{"name":"draw_sprite_ext_override","order":9,"path":"scripts/draw_sprite_ext_override/draw_sprite_ext_override.yy",},
{"name":"node_array_add","order":6,"path":"scripts/node_array_add/node_array_add.yy",},
{"name":"o_dialog_textbox_function_guide","order":8,"path":"objects/o_dialog_textbox_function_guide/o_dialog_textbox_function_guide.yy",},
{"name":"node_3d_material","order":7,"path":"scripts/node_3d_material/node_3d_material.yy",},
{"name":"node_3d_material","order":6,"path":"scripts/node_3d_material/node_3d_material.yy",},
{"name":"pcx_server","order":2,"path":"scripts/pcx_server/pcx_server.yy",},
{"name":"s_node_array_set","order":9,"path":"sprites/s_node_array_set/s_node_array_set.yy",},
{"name":"node_dust","order":19,"path":"scripts/node_dust/node_dust.yy",},
@ -1714,6 +1715,7 @@
{"name":"node_iterator_sort_input","order":1,"path":"scripts/node_iterator_sort_input/node_iterator_sort_input.yy",},
{"name":"draw_corner","order":19,"path":"scripts/draw_corner/draw_corner.yy",},
{"name":"o_dialog_preference","order":7,"path":"objects/o_dialog_preference/o_dialog_preference.yy",},
{"name":"node_3d_transform_image","order":12,"path":"scripts/node_3d_transform_image/node_3d_transform_image.yy",},
{"name":"node_wrap","order":2,"path":"scripts/node_wrap/node_wrap.yy",},
{"name":"__node_3d_prim_sphere","order":3,"path":"scripts/__node_3d_prim_sphere/__node_3d_prim_sphere.yy",},
{"name":"tooltip_selector_object","order":1,"path":"scripts/tooltip_selector_object/tooltip_selector_object.yy",},

View file

@ -1098,6 +1098,7 @@
{"id":{"name":"s_node_HSV_combine","path":"sprites/s_node_HSV_combine/s_node_HSV_combine.yy",},},
{"id":{"name":"Obj_FirebaseFirestore_Collection_Query_GreaterEqual","path":"objects/Obj_FirebaseFirestore_Collection_Query_GreaterEqual/Obj_FirebaseFirestore_Collection_Query_GreaterEqual.yy",},},
{"id":{"name":"s_node_pb_box_contract","path":"sprites/s_node_pb_box_contract/s_node_pb_box_contract.yy",},},
{"id":{"name":"s_node_image_transform_3d","path":"sprites/s_node_image_transform_3d/s_node_image_transform_3d.yy",},},
{"id":{"name":"node_normal_light","path":"scripts/node_normal_light/node_normal_light.yy",},},
{"id":{"name":"o_dialog_release_note","path":"objects/o_dialog_release_note/o_dialog_release_note.yy",},},
{"id":{"name":"sh_fd_advect_material_rgba_16_glsl","path":"shaders/sh_fd_advect_material_rgba_16_glsl/sh_fd_advect_material_rgba_16_glsl.yy",},},
@ -2493,6 +2494,7 @@
{"id":{"name":"o_dialog_preference","path":"objects/o_dialog_preference/o_dialog_preference.yy",},},
{"id":{"name":"node_pb_fx","path":"scripts/node_pb_fx/node_pb_fx.yy",},},
{"id":{"name":"s_node_smokeSim_render_output","path":"sprites/s_node_smokeSim_render_output/s_node_smokeSim_render_output.yy",},},
{"id":{"name":"node_3d_transform_image","path":"scripts/node_3d_transform_image/node_3d_transform_image.yy",},},
{"id":{"name":"node_wrap","path":"scripts/node_wrap/node_wrap.yy",},},
{"id":{"name":"__node_3d_prim_sphere","path":"scripts/__node_3d_prim_sphere/__node_3d_prim_sphere.yy",},},
{"id":{"name":"o_dialog_about","path":"objects/o_dialog_about/o_dialog_about.yy",},},

View file

@ -594,8 +594,12 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr
drag_axis = noone;
UNDO_HOLDING = false;
}
if(onDrawOverlay3D != 0) onDrawOverlay3D(active, params, _mx, _my, _snx, _sny, _panel);
} #endregion
static onDrawOverlay3D = 0;
static setTransform = function(object, _data) { #region
if(object == noone) return;
var _pos = _data[0];

View file

@ -25,10 +25,10 @@
globalvar VERSION, SAVE_VERSION, VERSION_STRING, BUILD_NUMBER;
VERSION = 11571;
VERSION = 11600;
SAVE_VERSION = 11570;
VERSION_STRING = "1.15.7.1";
BUILD_NUMBER = 11571;
VERSION_STRING = "1.16rc1";
BUILD_NUMBER = 11600;
globalvar APPEND_MAP;
APPEND_MAP = ds_map_create();

View file

@ -129,25 +129,27 @@ function Node_3D_Camera(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group)
UNDO_HOLDING = false;
}
var _outSurf = outputs[| 0].getValue();
if(is_array(_outSurf)) _outSurf = array_safe_get(_outSurf, 0);
if(!is_surface(_outSurf)) return;
#region draw result
var _outSurf = outputs[| 0].getValue();
if(is_array(_outSurf)) _outSurf = array_safe_get(_outSurf, 0);
if(!is_surface(_outSurf)) return;
var _w = _panel.w;
var _h = _panel.h - _panel.toolbar_height;
var _pw = surface_get_width_safe(_outSurf);
var _ph = surface_get_height_safe(_outSurf);
var _ps = min(128 / _ph, 160 / _pw);
var _w = _panel.w;
var _h = _panel.h - _panel.toolbar_height;
var _pw = surface_get_width_safe(_outSurf);
var _ph = surface_get_height_safe(_outSurf);
var _ps = min(128 / _ph, 160 / _pw);
var _pws = _pw * _ps;
var _phs = _ph * _ps;
var _pws = _pw * _ps;
var _phs = _ph * _ps;
var _px = _w - 16 - _pws;
var _py = _h - 16 - _phs;
var _px = _w - 16 - _pws;
var _py = _h - 16 - _phs;
draw_surface_ext_safe(_outSurf, _px, _py, _ps, _ps);
draw_set_color(COLORS._main_icon);
draw_rectangle(_px, _py, _px + _pws, _py + _phs, true);
draw_surface_ext_safe(_outSurf, _px, _py, _ps, _ps);
draw_set_color(COLORS._main_icon);
draw_rectangle(_px, _py, _px + _pws, _py + _phs, true);
#endregion
} #endregion
static onValueUpdate = function(index) { #region

View file

@ -0,0 +1,43 @@
function Node_3D_Mesh_Plane(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _group) constructor {
name = "3D Plane";
object_class = __3dPlane;
inputs[| in_mesh + 0] = nodeValue("Material", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone )
.setVisible(true, true);
inputs[| in_mesh + 1] = nodeValue("Normal", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 2 )
.setDisplay(VALUE_DISPLAY.enum_button, [ "X", "Y", "Z" ]);
inputs[| in_mesh + 2] = nodeValue("Both side", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false )
inputs[| in_mesh + 3] = nodeValue("Back Material", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone )
input_display_list = [
__d3d_input_list_mesh, in_mesh + 1,
__d3d_input_list_transform,
["Material", false], in_mesh + 2, in_mesh + 0, in_mesh + 3,
]
static step = function() {
var _both = getSingleValue(in_mesh + 2);
inputs[| in_mesh + 3].setVisible(_both, _both);
}
static processData = function(_output, _data, _output_index, _array_index = 0) { #region
var _mat = _data[in_mesh + 0];
var _axs = _data[in_mesh + 1];
var _both = _data[in_mesh + 2];
var _bmat = _data[in_mesh + 3];
var object = getObject(_array_index);
object.checkParameter({ normal: _axs, two_side: _both });
object.materials = _both? [ _mat, _bmat ] : [ _mat ];
setTransform(object, _data);
return object;
} #endregion
static getPreviewValues = function() { return array_safe_get(all_inputs, in_mesh + 0, noone); }
}

View file

@ -0,0 +1,110 @@
function Node_3D_Transform_Image(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _group) constructor {
name = "Transform 3D";
preview_channel = 1;
object = new __3dPlane();
object.checkParameter({ normal: 2 });
objectPreview = new __3dPlane();
objectPreview.checkParameter({ normal: 2 });
materialPreview = new __d3dMaterial();
objectPreview.materials[0] = materialPreview;
camera = camera_create();
viewMat = matrix_build_lookat(0, 0, 1,
0, 0, 0,
1, 0, 0);
projMat = matrix_build_projection_ortho(1, 1, 0.001, 10);
inputs[| in_mesh + 0] = nodeValue("Surface", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone )
.setVisible(true, true);
input_display_list = [
["Material", false], in_mesh + 0,
__d3d_input_list_transform,
]
outputs[| 0].setVisible(false);
outputs[| 1] = nodeValue("Rendered", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone);
output_display_list = [ 1 ]
static onDrawOverlay3D = function(active, params, _mx, _my, _snx, _sny, _panel) {
#region draw result
var _outSurf = outputs[| 1].getValue();
if(is_array(_outSurf)) _outSurf = array_safe_get(_outSurf, preview_index);
if(!is_surface(_outSurf)) return;
var _w = _panel.w;
var _h = _panel.h - _panel.toolbar_height;
var _pw = surface_get_width_safe(_outSurf);
var _ph = surface_get_height_safe(_outSurf);
var _ps = min(128 / _ph, 160 / _pw);
var _pws = _pw * _ps;
var _phs = _ph * _ps;
var _px = _w - 16 - _pws;
var _py = _h - 16 - _phs;
draw_surface_ext_safe(_outSurf, _px, _py, _ps, _ps);
draw_set_color(COLORS._main_icon);
draw_rectangle(_px, _py, _px + _pws, _py + _phs, true);
#endregion
}
static processData = function(_output, _data, _output_index, _array_index = 0) { #region
var _surf = _data[in_mesh + 0];
if(!is_surface(_surf)) return 0;
if(_output_index == 0) {
object.materials = [ new __d3dMaterial(_surf) ];
setTransform(object, _data);
if(_array_index == preview_index) {
materialPreview.surface = _surf;
setTransform(objectPreview, _data);
}
return object;
}
if(_output_index == 1) {
_output = surface_verify(_output, surface_get_width_safe(_surf), surface_get_height_safe(_surf));
surface_set_target(_output);
DRAW_CLEAR
camera_set_view_mat(camera, viewMat);
camera_set_proj_mat(camera, projMat);
camera_apply(camera);
object.transform.submitMatrix();
matrix_set(matrix_world, matrix_stack_top());
vertex_submit(object.VB[0], pr_trianglelist, surface_get_texture(_surf));
object.transform.clearMatrix();
matrix_set(matrix_world, matrix_build_identity());
camera_apply(0);
surface_reset_target();
return _output;
}
return 0;
} #endregion
static getPreviewObject = function() { return objectPreview; }
static getPreviewValues = function() { return array_safe_get(all_inputs, in_mesh + 0, noone); }
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover = false, _focus = false) { #region
var _surf = outputs[| 1].getValue();
if(is_array(_surf)) _surf = array_safe_get(_surf[preview_index]);
if(!is_surface(_surf)) return;
var bbox = drawGetBbox(xx, yy, _s);
draw_surface_bbox(_surf, bbox);
} #endregion
}

View file

@ -0,0 +1,11 @@
{
"resourceType": "GMScript",
"resourceVersion": "1.0",
"name": "node_3d_transform_image",
"isCompatibility": false,
"isDnD": false,
"parent": {
"name": "3D",
"path": "folders/nodes/data/3D.yy",
},
}

View file

@ -0,0 +1,12 @@
{
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "variable",
"path": "folders/nodes/data/variable.yy",
},
"resourceVersion": "1.0",
"name": "node_counter",
"tags": [],
"resourceType": "GMScript",
}

View file

@ -295,6 +295,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
var _hi = ui(junction_draw_pad_y);
var _ho = ui(junction_draw_pad_y);
var _prev_surf = previewable && (preview_channel < ds_list_size(outputs) && outputs[| preview_channel].type == VALUE_TYPE.surface);
for( var i = 0; i < ds_list_size(inputs); i++ ) {
var _inp = inputs[| i];
@ -308,7 +309,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
for( var i = 0; i < ds_list_size(outputs); i++ )
if(outputs[| i].isVisible()) _ho += 24;
h = max(min_h, previewable * 128, _hi, _ho);
h = max(min_h, _prev_surf * 128, _hi, _ho);
} run_in(1, function() { setHeight(); }); #endregion
static setDisplayName = function(_name) { #region

View file

@ -11,7 +11,7 @@ function Node_Palette_Extract(_x, _y, _group = noone) : Node(_x, _y, _group) con
.rejectArray();
inputs[| 3] = nodeValue("Algorithm", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "K-mean", "Frequency", "All colors" ])
.setDisplay(VALUE_DISPLAY.enum_scroll, { data: [ "K-mean", "Frequency", "All colors" ], update_hover: false })
.rejectArray();
outputs[| 0] = nodeValue("Palette", self, JUNCTION_CONNECT.output, VALUE_TYPE.color, [ ])

View file

@ -498,11 +498,12 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { #regio
addNodeObject(d3d, "Sprite Stack", s_node_stack, "Node_Sprite_Stack", [1, Node_Sprite_Stack],, "Create sprite stack either from repeating a single image or stacking different images using array.");
ds_list_add(d3d, "3D");
addNodeObject(d3d, "3D Camera", s_node_3d_camera, "Node_3D_Camera", [1, Node_3D_Camera]).setVersion(11510);
addNodeObject(d3d, "3D Camera Set", s_node_3d_camera_set, "Node_3D_Camera_Set", [1, Node_3D_Camera_Set]).setVersion(11571);
addNodeObject(d3d, "3D Material", s_node_3d_meterial, "Node_3D_Material", [1, Node_3D_Material]).setVersion(11510);
addNodeObject(d3d, "3D Scene", s_node_3d_scene, "Node_3D_Scene", [1, Node_3D_Scene]).setVersion(11510);
addNodeObject(d3d, "3D Repeat", s_node_3d_array, "Node_3D_Repeat", [1, Node_3D_Repeat]).setVersion(11510);
addNodeObject(d3d, "3D Camera", s_node_3d_camera, "Node_3D_Camera", [1, Node_3D_Camera]).setVersion(11510);
addNodeObject(d3d, "3D Camera Set", s_node_3d_camera_set, "Node_3D_Camera_Set", [1, Node_3D_Camera_Set]).setVersion(11571);
addNodeObject(d3d, "3D Material", s_node_3d_meterial, "Node_3D_Material", [1, Node_3D_Material]).setVersion(11510);
addNodeObject(d3d, "3D Scene", s_node_3d_scene, "Node_3D_Scene", [1, Node_3D_Scene]).setVersion(11510);
addNodeObject(d3d, "3D Repeat", s_node_3d_array, "Node_3D_Repeat", [1, Node_3D_Repeat]).setVersion(11510);
addNodeObject(d3d, "Transform 3D", s_node_image_transform_3d, "Node_3D_Transform_Image", [1, Node_3D_Transform_Image],, "Transform image in 3D space").setVersion(11600);
ds_list_add(d3d, "Mesh");
addNodeObject(d3d, "3D Object", s_node_3d_obj, "Node_3D_Mesh_Obj", [0, Node_create_3D_Obj],, "Load .obj file from your computer as a 3D object.").setVersion(11510);

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View file

@ -0,0 +1,74 @@
{
"resourceType": "GMSprite",
"resourceVersion": "1.0",
"name": "s_node_image_transform_3d",
"bbox_bottom": 62,
"bbox_left": 13,
"bbox_right": 50,
"bbox_top": 1,
"bboxMode": 0,
"collisionKind": 1,
"collisionTolerance": 0,
"DynamicTexturePage": false,
"edgeFiltering": false,
"For3D": false,
"frames": [
{"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"fd1959b6-75b9-42a3-b449-4ec476e5d3b7",},
],
"gridX": 0,
"gridY": 0,
"height": 64,
"HTile": false,
"layers": [
{"resourceType":"GMImageLayer","resourceVersion":"1.0","name":"6ab7e1e4-082d-417e-a93e-4ae569a8492c","blendMode":0,"displayName":"default","isLocked":false,"opacity":100.0,"visible":true,},
],
"nineSlice": null,
"origin": 4,
"parent": {
"name": "3D",
"path": "folders/nodes/icons/3D.yy",
},
"preMultiplyAlpha": false,
"sequence": {
"resourceType": "GMSequence",
"resourceVersion": "1.4",
"name": "s_node_image_transform_3d",
"autoRecord": true,
"backdropHeight": 768,
"backdropImageOpacity": 0.5,
"backdropImagePath": "",
"backdropWidth": 1366,
"backdropXOffset": 0.0,
"backdropYOffset": 0.0,
"events": {"resourceType":"KeyframeStore<MessageEventKeyframe>","resourceVersion":"1.0","Keyframes":[],},
"eventStubScript": null,
"eventToFunction": {},
"length": 1.0,
"lockOrigin": false,
"moments": {"resourceType":"KeyframeStore<MomentsEventKeyframe>","resourceVersion":"1.0","Keyframes":[],},
"playback": 1,
"playbackSpeed": 30.0,
"playbackSpeedType": 0,
"showBackdrop": true,
"showBackdropImage": false,
"timeUnits": 1,
"tracks": [
{"resourceType":"GMSpriteFramesTrack","resourceVersion":"1.0","name":"frames","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"resourceType":"KeyframeStore<SpriteFrameKeyframe>","resourceVersion":"1.0","Keyframes":[
{"resourceType":"Keyframe<SpriteFrameKeyframe>","resourceVersion":"1.0","Channels":{"0":{"resourceType":"SpriteFrameKeyframe","resourceVersion":"1.0","Id":{"name":"fd1959b6-75b9-42a3-b449-4ec476e5d3b7","path":"sprites/s_node_image_transform_3d/s_node_image_transform_3d.yy",},},},"Disabled":false,"id":"1f916d17-4fe4-4671-8559-36a8c909095f","IsCreationKey":false,"Key":0.0,"Length":1.0,"Stretch":false,},
],},"modifiers":[],"spriteId":null,"trackColour":0,"tracks":[],"traits":0,},
],
"visibleRange": null,
"volume": 1.0,
"xorigin": 32,
"yorigin": 32,
},
"swatchColours": null,
"swfPrecision": 2.525,
"textureGroupId": {
"name": "Default",
"path": "texturegroups/Default",
},
"type": 0,
"VTile": false,
"width": 64,
}