@@ -14,8 +14,8 @@ class TabObjects {
zui_begin_sticky();
zui_row([1 / 4]);
if (zui_button("Import")) {
- Project.import_mesh(false, () => {
- object_set_parent(Project.paint_objects.pop().base, null);
+ project_import_mesh(false, () => {
+ object_set_parent(project_paint_objects.pop().base, null);
});
}
zui_end_sticky();
@@ -40,7 +40,7 @@ class TabObjects {
// Highlight selected line
- if (currentObject == Context.raw.selected_object) {
+ if (currentObject == context_context_raw.selected_object) {
g2_set_color(0xff205d9c);
g2_fill_rect(0, ui._y, ui._window_w, zui_ELEMENT_H(ui));
g2_set_color(0xffffffff);
@@ -68,7 +68,7 @@ class TabObjects {
ui._y -= zui_ELEMENT_OFFSET(ui);
if (ui.is_released) {
- Context.raw.selected_object = currentObject;
+ context_context_raw.selected_object = currentObject;
if (ui.is_hovered && ui.input_released_r) {
@@ -127,12 +127,12 @@ class TabObjects {
if (zui_panel(zui_handle("tabobjects_2", {selected: true}), 'Properties')) {
// ui.indent();
- if (Context.raw.selected_object != null) {
+ if (context_context_raw.selected_object != null) {
let h = zui_handle("tabobjects_3");
- h.selected = Context.raw.selected_object.visible;
- Context.raw.selected_object.visible = zui_check(h, "Visible");
+ h.selected = context_context_raw.selected_object.visible;
+ context_context_raw.selected_object.visible = zui_check(h, "Visible");
- let t = Context.raw.selected_object.transform;
+ let t = context_context_raw.selected_object.transform;
let localPos = t.loc;
let worldPos = vec4_create(transform_world_x(t), transform_world_y(t), transform_world_z(t), 1.0);
let scale = t.scale;
@@ -178,10 +178,10 @@ class TabObjects {
f = parseFloat(zui_text_input(h, "Z"));
if (h.changed) { changed = true; rot.z = f; }
- if (changed && Context.raw.selected_object.name != "Scene") {
+ if (changed && context_context_raw.selected_object.name != "Scene") {
vec4_mult(rot, 3.141592 / 180);
- quat_from_euler(Context.raw.selected_object.transform.rot, rot.x, rot.y, rot.z);
- transform_build_matrix(Context.raw.selected_object.transform);
+ quat_from_euler(context_context_raw.selected_object.transform.rot, rot.x, rot.y, rot.z);
+ transform_build_matrix(context_context_raw.selected_object.transform);
// ///if arm_physics
// if (rb != null) rb.syncTransform();
// ///end
@@ -223,20 +223,20 @@ class TabObjects {
if (h.changed) dim.z = f;
- Context.raw.selected_object.transform.dirty = true;
+ context_context_raw.selected_object.transform.dirty = true;
- if (Context.raw.selected_object.name == "Scene") {
+ if (context_context_raw.selected_object.name == "Scene") {
let p = scene_world;
p.strength = zui_slider(zui_handle("tabobjects_16", {value: p.strength}), "Environment", 0.0, 5.0, true);
- else if (Context.raw.selected_object.ext_type == "light_object_t") {
- let light = Context.raw.selected_object.ext;
+ else if (context_context_raw.selected_object.ext_type == "light_object_t") {
+ let light = context_context_raw.selected_object.ext;
let lightHandle = zui_handle("tabobjects_17");
lightHandle.value = light.data.strength / 10;
light.data.strength = zui_slider(lightHandle, "Strength", 0.0, 5.0, true) * 10;
- else if (Context.raw.selected_object.ext_type == "camera_object_t") {
- let cam = Context.raw.selected_object.ext;
+ else if (context_context_raw.selected_object.ext_type == "camera_object_t") {
+ let cam = context_context_raw.selected_object.ext;
let fovHandle = zui_handle("tabobjects_18");
fovHandle.value = Math.floor(cam.data.fov * 100) / 100;
cam.data.fov = zui_slider(fovHandle, "FoV", 0.3, 2.0, true);
@@ -6,7 +6,7 @@ class MakeMaterial {
static heightUsed = false;
static parseMeshMaterial = () => {
- let m = Project.materialData;
+ let m = project_materialData;
for (let c of m._.shader.contexts) {
if (c.name == "mesh") {
@@ -24,14 +24,14 @@ class MakeMaterial {
let sampler = con.frag.sharedSamplers[0];
scon._.override_context.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
- if (!Context.raw.textureFilter) {
+ if (!context_raw.textureFilter) {
scon._.override_context.filter = "point";
scon._.override_context.addressing = "repeat";
m._.shader.contexts.push(scon);
m._.shader._.contexts.push(scon);
- Context.raw.ddirty = 2;
+ context_raw.ddirty = 2;
///if arm_voxels
MakeMaterial.makeVoxel(m);
@@ -45,7 +45,7 @@ class MakeMaterial {
static makeVoxel = (m: material_data_t) => {
let rebuild = true; // heightUsed;
- if (Config.raw.rp_gi != false && rebuild) {
+ if (config_raw.rp_gi != false && rebuild) {
let scon: shader_context_t = null;
for (let c of m._.shader._.contexts) {
if (c.name == "voxel") {
@@ -53,13 +53,13 @@ class MakeMaterial {
break;
- if (scon != null) MakeVoxel.run(scon);
+ if (scon != null) make_voxel_run(scon);
///end
static parsePaintMaterial = () => {
let mcon: material_context_t = null;
@@ -103,12 +103,12 @@ class MakeMaterial {
static getDisplaceStrength = (): f32 => {
- let sc = Context.mainObject().base.transform.scale.x;
- return Config.raw.displace_strength * 0.02 * sc;
+ let sc = context_mainObject().base.transform.scale.x;
+ return config_raw.displace_strength * 0.02 * sc;
static voxelgiHalfExtents = (): string => {
- let ext = Context.raw.vxaoExt;
+ let ext = context_raw.vxaoExt;
return `const vec3 voxelgiHalfExtents = vec3(${ext}, ${ext}, ${ext});`;
@@ -4,18 +4,18 @@ class MakeMesh {
static layerPassCount = 1;
static run = (data: TMaterial, layerPass = 0): NodeShaderContextRaw => {
- let con_mesh = NodeShaderContext.create(data, {
+ let con_mesh = NodeShadercontext_create(data, {
name: "mesh",
depth_write: layerPass == 0 ? true : false,
compare_mode: layerPass == 0 ? "less" : "equal",
- cull_mode: (Context.raw.cullBackfaces || layerPass > 0) ? "clockwise" : "none",
+ cull_mode: (context_raw.cullBackfaces || layerPass > 0) ? "clockwise" : "none",
vertex_elements: [{name: "pos", data: "short4norm"}, {name: "nor", data: "short2norm"}, {name: "tex", data: "short2norm"}],
color_attachments: ["RGBA64", "RGBA64", "RGBA64"],
depth_attachment: "DEPTH32"
- let vert = NodeShaderContext.make_vert(con_mesh);
- let frag = NodeShaderContext.make_frag(con_mesh);
+ let vert = NodeShadercontext_make_vert(con_mesh);
+ let frag = NodeShadercontext_make_frag(con_mesh);
frag.ins = vert.outs;
NodeShader.add_out(vert, 'vec2 texCoord');
@@ -35,7 +35,7 @@ class MakeMesh {
NodeShader.write(vert, 'gl_Position = mul(vec4(wposition.xyz, 1.0), VP);');
- let brushScale = Context.raw.brushScale;
+ let brushScale = context_raw.brushScale;
NodeShader.add_uniform(vert, 'float texScale', '_tex_unpack');
NodeShader.write(vert, `texCoord = tex * ${brushScale} * texScale;`);
if (MakeMaterial.heightUsed && displaceStrength > 0) {
@@ -73,7 +73,7 @@ class MakeMesh {
NodeShader.write(frag, 'float height3 = 0.0;');
- if (Context.raw.viewportMode == ViewportMode.ViewLit && Context.raw.renderMode == RenderMode.RenderForward) {
+ if (context_raw.viewportMode == ViewportMode.ViewLit && context_raw.renderMode == RenderMode.RenderForward) {
NodeShader.add_uniform(frag, 'sampler2D senvmapBrdf', "$brdf.k");
NodeShader.add_uniform(frag, 'sampler2D senvmapRadiance', '_envmap_radiance');
NodeShader.add_uniform(frag, 'sampler2D sltcMat', '_ltcMat');
@@ -136,15 +136,15 @@ class MakeMesh {
NodeShader.write(frag, 'n.y = -n.y;');
NodeShader.write(frag, 'n = normalize(mul(n, TBN));');
- if (Context.raw.viewportMode == ViewportMode.ViewLit || Context.raw.viewportMode == ViewportMode.ViewPathTrace) {
+ if (context_raw.viewportMode == ViewportMode.ViewLit || context_raw.viewportMode == ViewportMode.ViewPathTrace) {
NodeShader.write(frag, 'basecol = pow(basecol, vec3(2.2, 2.2, 2.2));');
- if (Context.raw.viewportShader != null) {
- let color = Context.raw.viewportShader(frag);
+ if (context_raw.viewportShader != null) {
+ let color = context_raw.viewportShader(frag);
NodeShader.write(frag, `fragColor[1] = vec4(${color}, 1.0);`);
- else if (Context.raw.renderMode == RenderMode.RenderForward && Context.raw.viewportMode != ViewportMode.ViewPathTrace) {
+ else if (context_raw.renderMode == RenderMode.RenderForward && context_raw.viewportMode != ViewportMode.ViewPathTrace) {
frag.wposition = true;
NodeShader.write(frag, 'vec3 albedo = mix(basecol, vec3(0.0, 0.0, 0.0), metallic);');
NodeShader.write(frag, 'vec3 f0 = mix(vec3(0.04, 0.04, 0.04), basecol, metallic);');
@@ -191,32 +191,32 @@ class MakeMesh {
NodeShader.write(frag, 'fragColor[1] = vec4(basecol, occlusion);');
- else if (Context.raw.viewportMode == ViewportMode.ViewBaseColor) {
+ else if (context_raw.viewportMode == ViewportMode.ViewBaseColor) {
NodeShader.write(frag, 'fragColor[1] = vec4(basecol, 1.0);');
- else if (Context.raw.viewportMode == ViewportMode.ViewNormalMap) {
+ else if (context_raw.viewportMode == ViewportMode.ViewNormalMap) {
NodeShader.write(frag, 'fragColor[1] = vec4(ntex.rgb, 1.0);');
- else if (Context.raw.viewportMode == ViewportMode.ViewOcclusion) {
+ else if (context_raw.viewportMode == ViewportMode.ViewOcclusion) {
NodeShader.write(frag, 'fragColor[1] = vec4(vec3(occlusion, occlusion, occlusion), 1.0);');
- else if (Context.raw.viewportMode == ViewportMode.ViewRoughness) {
+ else if (context_raw.viewportMode == ViewportMode.ViewRoughness) {
NodeShader.write(frag, 'fragColor[1] = vec4(vec3(roughness, roughness, roughness), 1.0);');
- else if (Context.raw.viewportMode == ViewportMode.ViewMetallic) {
+ else if (context_raw.viewportMode == ViewportMode.ViewMetallic) {
NodeShader.write(frag, 'fragColor[1] = vec4(vec3(metallic, metallic, metallic), 1.0);');
- else if (Context.raw.viewportMode == ViewportMode.ViewOpacity) {
+ else if (context_raw.viewportMode == ViewportMode.ViewOpacity) {
NodeShader.write(frag, 'fragColor[1] = vec4(vec3(texpaint_sample.a, texpaint_sample.a, texpaint_sample.a), 1.0);');
- else if (Context.raw.viewportMode == ViewportMode.ViewHeight) {
+ else if (context_raw.viewportMode == ViewportMode.ViewHeight) {
NodeShader.write(frag, 'fragColor[1] = vec4(vec3(height, height, height), 1.0);');
else {
NodeShader.write(frag, 'fragColor[1] = vec4(1.0, 0.0, 1.0, 1.0);'); // Pink
- if (Context.raw.viewportMode != ViewportMode.ViewLit && Context.raw.viewportMode != ViewportMode.ViewPathTrace) {
+ if (context_raw.viewportMode != ViewportMode.ViewLit && context_raw.viewportMode != ViewportMode.ViewPathTrace) {
NodeShader.write(frag, 'fragColor[1].rgb = pow(fragColor[1].rgb, vec3(2.2, 2.2, 2.2));');
@@ -2,7 +2,7 @@
class MakePaint {
static run = (data: TMaterial, matcon: material_context_t): NodeShaderContextRaw => {
- let con_paint = NodeShaderContext.create(data, {
+ let con_paint = NodeShadercontext_create(data, {
name: "paint",
depth_write: false,
compare_mode: "always", // TODO: align texcoords winding order
@@ -10,7 +10,7 @@ class MakePaint {
cull_mode: "none",
color_attachments:
- Context.raw.tool == WorkspaceTool.ToolPicker ? ["RGBA32", "RGBA32", "RGBA32", "RGBA32"] :
+ context_raw.tool == WorkspaceTool.ToolPicker ? ["RGBA32", "RGBA32", "RGBA32", "RGBA32"] :
["RGBA32", "RGBA32", "RGBA32", "R8"]
@@ -18,13 +18,13 @@ class MakePaint {
con_paint.data.color_writes_green = [true, true, true, true];
con_paint.data.color_writes_blue = [true, true, true, true];
con_paint.data.color_writes_alpha = [true, true, true, true];
- con_paint.allow_vcols = mesh_data_get_vertex_array(Context.raw.paintObject.data, "col") != null;
+ con_paint.allow_vcols = mesh_data_get_vertex_array(context_raw.paintObject.data, "col") != null;
- let vert = NodeShaderContext.make_vert(con_paint);
- let frag = NodeShaderContext.make_frag(con_paint);
+ let vert = NodeShadercontext_make_vert(con_paint);
+ let frag = NodeShadercontext_make_frag(con_paint);
- if (Context.raw.tool == WorkspaceTool.ToolPicker) {
+ if (context_raw.tool == WorkspaceTool.ToolPicker) {
// Mangle vertices to form full screen triangle
NodeShader.write(vert, 'gl_Position = vec4(-1.0 + float((gl_VertexID & 1) << 2), -1.0 + float((gl_VertexID & 2) << 1), 0.0, 1.0);');
@@ -85,10 +85,10 @@ class MakePaint {
NodeShader.add_uniform(frag, 'float brushOpacity', '_brushOpacity');
NodeShader.add_uniform(frag, 'float brushHardness', '_brushHardness');
- if (Context.raw.tool == WorkspaceTool.ToolEraser ||
- Context.raw.tool == WorkspaceTool.ToolClone ||
- Context.raw.tool == WorkspaceTool.ToolBlur ||
- Context.raw.tool == WorkspaceTool.ToolSmudge) {
+ if (context_raw.tool == WorkspaceTool.ToolEraser ||
+ context_raw.tool == WorkspaceTool.ToolClone ||
+ context_raw.tool == WorkspaceTool.ToolBlur ||
+ context_raw.tool == WorkspaceTool.ToolSmudge) {
NodeShader.write(frag, 'float dist = 0.0;');
@@ -129,14 +129,14 @@ class MakePaint {
// NodeShader.add_out(vert, 'vec2 texCoord');
// NodeShader.write(vert, 'texCoord = tex * brushScale * texScale;');
- if (Context.raw.tool == WorkspaceTool.ToolClone || Context.raw.tool == WorkspaceTool.ToolBlur || Context.raw.tool == WorkspaceTool.ToolSmudge) {
+ if (context_raw.tool == WorkspaceTool.ToolClone || context_raw.tool == WorkspaceTool.ToolBlur || context_raw.tool == WorkspaceTool.ToolSmudge) {
NodeShader.add_uniform(frag, 'sampler2D gbuffer2');
NodeShader.add_uniform(frag, 'vec2 gbufferSize', '_gbufferSize');
NodeShader.add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo');
NodeShader.add_uniform(frag, 'sampler2D texpaint_nor_undo', '_texpaint_nor_undo');
NodeShader.add_uniform(frag, 'sampler2D texpaint_pack_undo', '_texpaint_pack_undo');
- if (Context.raw.tool == WorkspaceTool.ToolClone) {
+ if (context_raw.tool == WorkspaceTool.ToolClone) {
// NodeShader.add_uniform(frag, 'vec2 cloneDelta', '_cloneDelta');
// ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
// NodeShader.write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2((sp.xy + cloneDelta) * gbufferSize), 0).ba;');
@@ -179,7 +179,7 @@ class MakePaint {
// NodeShader.add_uniform(frag, 'vec2 texpaintSize', '_texpaintSize');
// NodeShader.write(frag, 'float blur_step = 1.0 / texpaintSize.x;');
- // if (Context.raw.blurDirectional) {
+ // if (context_raw.blurDirectional) {
// ///if (krom_direct3d11 || krom_direct3d12 || krom_metal)
// NodeShader.write(frag, 'const float blur_weight[7] = {1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0};');
// ///else
@@ -257,7 +257,7 @@ class MakePaint {
NodeShader.write(frag, 'vec4 sample_undo = textureLod(texpaint_undo, sample_tc, 0.0);');
- if (Context.raw.tool == WorkspaceTool.ToolEraser) {
+ if (context_raw.tool == WorkspaceTool.ToolEraser) {
// NodeShader.write(frag, 'fragColor[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);');
NodeShader.write(frag, 'fragColor[0] = vec4(0.0, 0.0, 0.0, 0.0);');
NodeShader.write(frag, 'fragColor[1] = vec4(0.5, 0.5, 1.0, 0.0);');
@@ -30,8 +30,8 @@ class NodesBrush {
for (let c of NodesBrush.list) {
for (let n of c) {
if (n.type == nodeType) {
- let canvas = Project.canvas;
- let nodes = Project.nodes;
+ let canvas = project_canvas;
+ let nodes = project_nodes;
let node = UINodes.makeNode(n, nodes, canvas);
canvas.nodes.push(node);
return node;
@@ -8,16 +8,16 @@ class RenderPathPaint {
{
let t = render_target_create();
t.name = "texpaint_blend0";
- t.width = Config.getTextureResX();
- t.height = Config.getTextureResY();
+ t.width = config_getTextureResX();
+ t.height = config_getTextureResY();
t.format = "R8";
render_path_create_render_target(t);
t.name = "texpaint_blend1";
@@ -60,9 +60,9 @@ class RenderPathPaint {
static commandsPaint = (dilation = true) => {
let tid = "";
- if (Context.raw.pdirty > 0) {
+ if (context_raw.pdirty > 0) {
///if krom_metal
// render_path_set_target("texpaint_picker");
@@ -77,7 +77,7 @@ class RenderPathPaint {
// render_path_clear_target(0xff000000);
render_path_bind_target("gbuffer2", "gbuffer2");
- // tid = Context.raw.layer.id;
+ // tid = context_raw.layer.id;
render_path_bind_target("texpaint" + tid, "texpaint");
render_path_bind_target("texpaint_nor" + tid, "texpaint_nor");
render_path_bind_target("texpaint_pack" + tid, "texpaint_pack");
@@ -93,39 +93,39 @@ class RenderPathPaint {
let c = image_get_pixels(texpaint_pack_picker);
let d = image_get_pixels(texpaint_uv_picker);
- if (Context.raw.colorPickerCallback != null) {
- Context.raw.colorPickerCallback(Context.raw.pickedColor);
+ if (context_raw.colorPickerCallback != null) {
+ context_raw.colorPickerCallback(context_raw.pickedColor);
// Picked surface values
// ///if (krom_metal || krom_vulkan)
- // Context.raw.pickedColor.base.Rb = a.get(2);
- // Context.raw.pickedColor.base.Gb = a.get(1);
- // Context.raw.pickedColor.base.Bb = a.get(0);
- // Context.raw.pickedColor.normal.Rb = b.get(2);
- // Context.raw.pickedColor.normal.Gb = b.get(1);
- // Context.raw.pickedColor.normal.Bb = b.get(0);
- // Context.raw.pickedColor.occlusion = c.get(2) / 255;
- // Context.raw.pickedColor.roughness = c.get(1) / 255;
- // Context.raw.pickedColor.metallic = c.get(0) / 255;
- // Context.raw.pickedColor.height = c.get(3) / 255;
- // Context.raw.pickedColor.opacity = a.get(3) / 255;
- // Context.raw.uvxPicked = d.get(2) / 255;
- // Context.raw.uvyPicked = d.get(1) / 255;
+ // context_raw.pickedColor.base.Rb = a.get(2);
+ // context_raw.pickedColor.base.Gb = a.get(1);
+ // context_raw.pickedColor.base.Bb = a.get(0);
+ // context_raw.pickedColor.normal.Rb = b.get(2);
+ // context_raw.pickedColor.normal.Gb = b.get(1);
+ // context_raw.pickedColor.normal.Bb = b.get(0);
+ // context_raw.pickedColor.occlusion = c.get(2) / 255;
+ // context_raw.pickedColor.roughness = c.get(1) / 255;
+ // context_raw.pickedColor.metallic = c.get(0) / 255;
+ // context_raw.pickedColor.height = c.get(3) / 255;
+ // context_raw.pickedColor.opacity = a.get(3) / 255;
+ // context_raw.uvxPicked = d.get(2) / 255;
+ // context_raw.uvyPicked = d.get(1) / 255;
- // Context.raw.pickedColor.base.Rb = a.get(0);
- // Context.raw.pickedColor.base.Bb = a.get(2);
- // Context.raw.pickedColor.normal.Rb = b.get(0);
- // Context.raw.pickedColor.normal.Bb = b.get(2);
- // Context.raw.pickedColor.occlusion = c.get(0) / 255;
- // Context.raw.pickedColor.metallic = c.get(2) / 255;
- // Context.raw.uvxPicked = d.get(0) / 255;
+ // context_raw.pickedColor.base.Rb = a.get(0);
+ // context_raw.pickedColor.base.Bb = a.get(2);
+ // context_raw.pickedColor.normal.Rb = b.get(0);
+ // context_raw.pickedColor.normal.Bb = b.get(2);
+ // context_raw.pickedColor.occlusion = c.get(0) / 255;
+ // context_raw.pickedColor.metallic = c.get(2) / 255;
+ // context_raw.uvxPicked = d.get(0) / 255;
@@ -142,9 +142,9 @@ class RenderPathPaint {
render_path_bind_target("texpaint_blend1", "paintmask");
// Read texcoords from gbuffer
- let readTC = Context.raw.tool == WorkspaceTool.ToolClone ||
- Context.raw.tool == WorkspaceTool.ToolSmudge;
+ let readTC = context_raw.tool == WorkspaceTool.ToolClone ||
+ context_raw.tool == WorkspaceTool.ToolSmudge;
if (readTC) {
@@ -155,7 +155,7 @@ class RenderPathPaint {
static commandsCursor = () => {
- let tool = Context.raw.tool;
+ let tool = context_raw.tool;
if (tool != WorkspaceTool.ToolEraser &&
tool != WorkspaceTool.ToolClone &&
tool != WorkspaceTool.ToolBlur &&
@@ -171,13 +171,13 @@ class RenderPathPaint {
return;
- let mx = Context.raw.paintVec.x;
- let my = 1.0 - Context.raw.paintVec.y;
- if (Context.raw.brushLocked) {
- mx = (Context.raw.lockStartedX - app_x()) / app_w();
- my = 1.0 - (Context.raw.lockStartedY - app_y()) / app_h();
+ let mx = context_raw.paintVec.x;
+ let my = 1.0 - context_raw.paintVec.y;
+ if (context_raw.brushLocked) {
+ mx = (context_raw.lockStartedX - app_x()) / app_w();
+ my = 1.0 - (context_raw.lockStartedY - app_y()) / app_h();
- let radius = Context.raw.brushRadius;
+ let radius = context_raw.brushRadius;
RenderPathPaint.drawCursor(mx, my, radius / 3.4);
@@ -188,7 +188,7 @@ class RenderPathPaint {
render_path_set_target("");
g4_set_pipeline(base_pipeCursor);
- let img = Res.get("cursor.k");
+ let img = resource_get("cursor.k");
g4_set_tex(base_cursorTex, img);
let gbuffer0 = render_path_render_targets.get("gbuffer0")._image;
g4_set_tex_depth(base_cursorGbufferD, gbuffer0);
@@ -215,7 +215,7 @@ class RenderPathPaint {
static paintEnabled = (): bool => {
- return !Context.raw.foregroundEvent;
+ return !context_raw.foregroundEvent;
static begin = () => {
@@ -224,11 +224,11 @@ class RenderPathPaint {
static end = () => {
RenderPathPaint.commandsCursor();
- Context.raw.ddirty--;
- Context.raw.rdirty--;
+ context_raw.ddirty--;
+ context_raw.rdirty--;
if (!RenderPathPaint.paintEnabled()) return;
- Context.raw.pdirty--;
+ context_raw.pdirty--;
static draw = () => {
@@ -236,8 +236,8 @@ class RenderPathPaint {
RenderPathPaint.commandsPaint();
- if (Context.raw.brushBlendDirty) {
- Context.raw.brushBlendDirty = false;
+ if (context_raw.brushBlendDirty) {
+ context_raw.brushBlendDirty = false;
render_path_set_target("texpaint_blend0");
render_path_clear_target(0x00000000);
@@ -265,16 +265,16 @@ class RenderPathPaint {
if (render_path_render_targets.get("texpaint_node") == null) {
t.name = "texpaint_node";
t.format = "RGBA32";
render_path_render_targets.set(t.name, t);
if (render_path_render_targets.get("texpaint_node_target") == null) {
t.name = "texpaint_node_target";
@@ -6,7 +6,7 @@ class UINodesExt {
static drawButtons = (ew: f32, startY: f32) => {
let ui = UINodes.ui;
if (zui_button(tr("Run"))) {
- Console.progress(tr("Processing"));
+ console_progress(tr("Processing"));
let delayIdleSleep = () => {
krom_delay_idle_sleep();
@@ -18,8 +18,8 @@ class UINodesExt {
let taskDone = () => {
tasks--;
if (tasks == 0) {
- Console.progress(null);
+ console_progress(null);
app_remove_render_2d(delayIdleSleep);
///if (krom_direct3d12 || krom_vulkan || krom_metal)
@@ -30,7 +30,7 @@ class UINodesExt {
base_notifyOnNextFrame(() => {
let timer = time_time();
- ParserLogic.parse(Project.canvas);
+ ParserLogic.parse(project_canvas);
PhotoToPBRNode.cachedSource = null;
BrushOutputNode.inst.getAsImage(ChannelType.ChannelBaseColor, (texbase: image_t) => {
@@ -42,14 +42,14 @@ class UINodesExt {
if (texbase != null) {
let texpaint = render_path_render_targets.get("texpaint")._image;
g2_begin(texpaint);
- g2_draw_scaled_image(texbase, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+ g2_draw_scaled_image(texbase, 0, 0, config_getTextureResX(), config_getTextureResY());
g2_end();
if (texnor != null) {
let texpaint_nor = render_path_render_targets.get("texpaint_nor")._image;
g2_begin(texpaint_nor);
- g2_draw_scaled_image(texnor, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+ g2_draw_scaled_image(texnor, 0, 0, config_getTextureResX(), config_getTextureResY());
@@ -62,7 +62,7 @@ class UINodesExt {
if (texocc != null) {
g2_begin(texpaint_pack);
g2_set_pipeline(base_pipeCopyR);
- g2_draw_scaled_image(texocc, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+ g2_draw_scaled_image(texocc, 0, 0, config_getTextureResX(), config_getTextureResY());
g2_set_pipeline(null);
@@ -70,7 +70,7 @@ class UINodesExt {
if (texrough != null) {
g2_set_pipeline(base_pipeCopyG);
- g2_draw_scaled_image(texrough, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+ g2_draw_scaled_image(texrough, 0, 0, config_getTextureResX(), config_getTextureResY());
@@ -88,7 +88,7 @@ class UINodesExt {
BrushOutputNode.inst.inputs[ChannelType.ChannelHeight].node.constructor != FloatNode) {
// Make copy of vertices before displacement
- let o = Project.paintObjects[0];
+ let o = project_paintObjects[0];
let g = o.data;
let vertices = g4_vertex_buffer_lock(g._.vertex_buffer);
if (UINodesExt.lastVertices == null || UINodesExt.lastVertices.byteLength != vertices.byteLength) {
@@ -105,13 +105,13 @@ class UINodesExt {
g4_vertex_buffer_unlock(g._.vertex_buffer);
// Apply displacement
- if (Config.raw.displace_strength > 0) {
+ if (config_raw.displace_strength > 0) {
tasks++;
- Console.progress(tr("Apply Displacement"));
+ console_progress(tr("Apply Displacement"));
- let uv_scale = scene_meshes[0].data.scale_tex * Context.raw.brushScale;
- UtilMesh.applyDisplacement(texpaint_pack, 0.05 * Config.raw.displace_strength, uv_scale);
+ let uv_scale = scene_meshes[0].data.scale_tex * context_raw.brushScale;
+ UtilMesh.applyDisplacement(texpaint_pack, 0.05 * config_raw.displace_strength, uv_scale);
UtilMesh.calcNormals();
taskDone();
@@ -120,7 +120,7 @@ class UINodesExt {
- Console.log("Processing finished in " + (time_time() - timer));
+ console_log("Processing finished in " + (time_time() - timer));
krom_ml_unload();
@@ -17,24 +17,24 @@ class BrushOutputNode extends LogicNode {
t.name = "texpaint";
this.texpaint = render_path_create_render_target(t)._image;
t.name = "texpaint_nor";
this.texpaint_nor = render_path_create_render_target(t)._image;
t.name = "texpaint_pack";
this.texpaint_pack = render_path_create_render_target(t)._image;
@@ -9,9 +9,9 @@ class ImageTextureNode extends LogicNode {
override getAsImage = (from: i32, done: (img: image_t)=>void) => {
- let index = Project.assetNames.indexOf(this.file);
- let asset = Project.assets[index];
- done(Project.getImage(asset));
+ let index = project_assetNames.indexOf(this.file);
+ let asset = project_assets[index];
+ done(project_getImage(asset));
override getCachedImage = (): image_t => {
@@ -19,11 +19,11 @@ class InpaintNode extends LogicNode {
static init = () => {
if (InpaintNode.image == null) {
- InpaintNode.image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY());
+ InpaintNode.image = image_create_render_target(config_getTextureResX(), config_getTextureResY());
if (InpaintNode.mask == null) {
- InpaintNode.mask = image_create_render_target(Config.getTextureResX(), Config.getTextureResY(), tex_format_t.R8);
+ InpaintNode.mask = image_create_render_target(config_getTextureResX(), config_getTextureResY(), tex_format_t.R8);
g4_begin(InpaintNode.mask);
g4_clear(color_from_floats(1.0, 1.0, 1.0, 1.0));
@@ -36,7 +36,7 @@ class InpaintNode extends LogicNode {
if (InpaintNode.result == null) {
- InpaintNode.result = image_create_render_target(Config.getTextureResX(), Config.getTextureResY());
+ InpaintNode.result = image_create_render_target(config_getTextureResX(), config_getTextureResY());
@@ -53,10 +53,10 @@ class InpaintNode extends LogicNode {
this.inputs[0].getAsImage((source: image_t) => {
- Console.progress(tr("Processing") + " - " + tr("Inpaint"));
+ console_progress(tr("Processing") + " - " + tr("Inpaint"));
g2_begin(InpaintNode.image);
- g2_draw_scaled_image(source, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+ g2_draw_scaled_image(source, 0, 0, config_getTextureResX(), config_getTextureResY());
InpaintNode.auto ? InpaintNode.texsynthInpaint(InpaintNode.image, false, InpaintNode.mask, done) : InpaintNode.sdInpaint(InpaintNode.image, InpaintNode.mask, done);
@@ -87,8 +87,8 @@ class InpaintNode extends LogicNode {
static texsynthInpaint = (image: image_t, tiling: bool, mask: image_t/* = null*/, done: (img: image_t)=>void) => {
- let w = Config.getTextureResX();
- let h = Config.getTextureResY();
+ let w = config_getTextureResX();
+ let h = config_getTextureResY();
let bytes_img = image_get_pixels(image);
let bytes_mask = mask != null ? image_get_pixels(mask) : new ArrayBuffer(w * h);
@@ -141,7 +141,7 @@ class InpaintNode extends LogicNode {
f32a[i + 512 * 512 * 2] = (u8a[i * 4 + 2] / 255.0) * 2.0 - 1.0;
- let latents_buf = krom_ml_inference(vae_encoder_blob, [f32a.buffer], [[1, 3, 512, 512]], [1, 4, 64, 64], Config.raw.gpu_inference);
+ let latents_buf = krom_ml_inference(vae_encoder_blob, [f32a.buffer], [[1, 3, 512, 512]], [1, 4, 64, 64], config_raw.gpu_inference);
let latents = new Float32Array(latents_buf);
for (let i = 0; i < latents.length; ++i) {
latents[i] = 0.18215 * latents[i];
@@ -24,7 +24,7 @@ class PhotoToPBRNode extends LogicNode {
if (PhotoToPBRNode.images == null) {
PhotoToPBRNode.images = [];
for (let i = 0; i < PhotoToPBRNode.modelNames.length; ++i) {
- PhotoToPBRNode.images.push(image_create_render_target(Config.getTextureResX(), Config.getTextureResY()));
+ PhotoToPBRNode.images.push(image_create_render_target(config_getTextureResX(), config_getTextureResY()));
@@ -38,24 +38,24 @@ class PhotoToPBRNode extends LogicNode {
getSource((source: image_t) => {
PhotoToPBRNode.cachedSource = source;
- Console.progress(tr("Processing") + " - " + tr("Photo to PBR"));
+ console_progress(tr("Processing") + " - " + tr("Photo to PBR"));
let tileFloats: Float32Array[] = [];
- let tilesX = Math.floor(Config.getTextureResX() / PhotoToPBRNode.tileW);
- let tilesY = Math.floor(Config.getTextureResY() / PhotoToPBRNode.tileW);
+ let tilesX = Math.floor(config_getTextureResX() / PhotoToPBRNode.tileW);
+ let tilesY = Math.floor(config_getTextureResY() / PhotoToPBRNode.tileW);
let numTiles = tilesX * tilesY;
for (let i = 0; i < numTiles; ++i) {
let x = i % tilesX;
let y = Math.floor(i / tilesX);
g2_begin(PhotoToPBRNode.temp);
- g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW, -Config.getTextureResX(), Config.getTextureResY());
- g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW, Config.getTextureResX(), -Config.getTextureResY());
- g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW, -Config.getTextureResX(), -Config.getTextureResY());
- g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, Config.getTextureResX(), Config.getTextureResY());
- g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, -Config.getTextureResX(), Config.getTextureResY());
- g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, Config.getTextureResX(), -Config.getTextureResY());
- g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW, Config.getTextureResX(), Config.getTextureResY());
+ g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW, -config_getTextureResX(), config_getTextureResY());
+ g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW, config_getTextureResX(), -config_getTextureResY());
+ g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW, -config_getTextureResX(), -config_getTextureResY());
+ g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, config_getTextureResX(), config_getTextureResY());
+ g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, -config_getTextureResX(), config_getTextureResY());
+ g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, config_getTextureResX(), -config_getTextureResY());
+ g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW, config_getTextureResX(), config_getTextureResY());
let bytes_img = image_get_pixels(PhotoToPBRNode.temp);
@@ -68,7 +68,7 @@ class PhotoToPBRNode extends LogicNode {
let model_blob: ArrayBuffer = data_get_blob("models/photo_to_" + PhotoToPBRNode.modelNames[from] + ".quant.onnx");
- let buf = krom_ml_inference(model_blob, [f32a.buffer], null, null, Config.raw.gpu_inference);
+ let buf = krom_ml_inference(model_blob, [f32a.buffer], null, null, config_raw.gpu_inference);
let ar = new Float32Array(buf);
u8a = new Uint8Array(4 * PhotoToPBRNode.tileW * PhotoToPBRNode.tileW);
let offsetG = (from == ChannelType.ChannelBaseColor || from == ChannelType.ChannelNormalMap) ? PhotoToPBRNode.tileWithBorderW * PhotoToPBRNode.tileWithBorderW : 0;
@@ -44,7 +44,7 @@ class TextToPhotoNode extends LogicNode {
static textEncoder = (prompt: string, inpaintLatents: Float32Array, done: (a: Float32Array, b: Float32Array)=>void) => {
- Console.progress(tr("Processing") + " - " + tr("Text to Photo"));
+ console_progress(tr("Processing") + " - " + tr("Text to Photo"));
let words = prompt.replaceAll("\n", " ").replaceAll(",", " , ").replaceAll(" ", " ").trim().split(" ");
for (let i = 0; i < words.length; ++i) {
@@ -55,11 +55,11 @@ class TextToPhotoNode extends LogicNode {
let i32a = new Int32Array(TextToPhotoNode.text_input_ids);
- let text_embeddings_buf = krom_ml_inference(TextToPhotoNode.text_encoder_blob, [i32a.buffer], [[1, 77]], [1, 77, 768], Config.raw.gpu_inference);
+ let text_embeddings_buf = krom_ml_inference(TextToPhotoNode.text_encoder_blob, [i32a.buffer], [[1, 77]], [1, 77, 768], config_raw.gpu_inference);
let text_embeddings = new Float32Array(text_embeddings_buf);
i32a = new Int32Array(TextToPhotoNode.uncond_input_ids);
- let uncond_embeddings_buf = krom_ml_inference(TextToPhotoNode.text_encoder_blob, [i32a.buffer], [[1, 77]], [1, 77, 768], Config.raw.gpu_inference);
+ let uncond_embeddings_buf = krom_ml_inference(TextToPhotoNode.text_encoder_blob, [i32a.buffer], [[1, 77]], [1, 77, 768], config_raw.gpu_inference);
let uncond_embeddings = new Float32Array(uncond_embeddings_buf);
let f32a = new Float32Array(uncond_embeddings.length + text_embeddings.length);
@@ -93,7 +93,7 @@ class TextToPhotoNode extends LogicNode {
let counter = 0;
let processing = () => {
- Console.progress(tr("Processing") + " - " + tr("Text to Photo") + " (" + (counter + 1) + "/" + (50 - offset) + ")");
+ console_progress(tr("Processing") + " - " + tr("Text to Photo") + " (" + (counter + 1) + "/" + (50 - offset) + ")");
let timestep = TextToPhotoNode.timesteps[counter + offset];
for (let i = 0; i < latents.length; ++i) latent_model_input[i] = latents[i];
@@ -101,7 +101,7 @@ class TextToPhotoNode extends LogicNode {
let t32 = new Int32Array(2);
t32[0] = timestep;
- let noise_pred_buf = krom_ml_inference(TextToPhotoNode.unet_blob, [latent_model_input.buffer, t32.buffer, text_embeddings.buffer], [[2, 4, 64, 64], [1], [2, 77, 768]], [2, 4, 64, 64], Config.raw.gpu_inference);
+ let noise_pred_buf = krom_ml_inference(TextToPhotoNode.unet_blob, [latent_model_input.buffer, t32.buffer, text_embeddings.buffer], [[2, 4, 64, 64], [1], [2, 77, 768]], [2, 4, 64, 64], config_raw.gpu_inference);
let noise_pred = new Float32Array(noise_pred_buf);
for (let i = 0; i < noise_pred_uncond.length; ++i) noise_pred_uncond[i] = noise_pred[i];
@@ -193,13 +193,13 @@ class TextToPhotoNode extends LogicNode {
static vaeDecoder = (latents: Float32Array, upscale: bool, done: (img: image_t)=>void) => {
latents[i] = 1.0 / 0.18215 * latents[i];
- let pyimage_buf = krom_ml_inference(TextToPhotoNode.vae_decoder_blob, [latents.buffer], [[1, 4, 64, 64]], [1, 3, 512, 512], Config.raw.gpu_inference);
+ let pyimage_buf = krom_ml_inference(TextToPhotoNode.vae_decoder_blob, [latents.buffer], [[1, 4, 64, 64]], [1, 3, 512, 512], config_raw.gpu_inference);
let pyimage = new Float32Array(pyimage_buf);
for (let i = 0; i < pyimage.length; ++i) {
@@ -225,7 +225,7 @@ class TextToPhotoNode extends LogicNode {
if (upscale) {
UpscaleNode.loadBlob(() => {
- while (image.width < Config.getTextureResX()) {
+ while (image.width < config_getTextureResX()) {
let lastImage = image;
image = UpscaleNode.esrgan(image);
image_unload(lastImage);
@@ -14,7 +14,7 @@ class TilingNode extends LogicNode {
if (TilingNode.image == null) {
- TilingNode.image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY());
+ TilingNode.image = image_create_render_target(config_getTextureResX(), config_getTextureResY());
@@ -31,10 +31,10 @@ class TilingNode extends LogicNode {
g2_begin(TilingNode.image);
- Console.progress(tr("Processing") + " - " + tr("Tiling"));
+ console_progress(tr("Processing") + " - " + tr("Tiling"));
let _done = (image: image_t) => {
this.result = image;
@@ -13,12 +13,12 @@ class UpscaleNode extends LogicNode {
this.inputs[0].getAsImage((_image: image_t) => {
UpscaleNode.image = _image;
- Console.progress(tr("Processing") + " - " + tr("Upscale"));
+ console_progress(tr("Processing") + " - " + tr("Upscale"));
- if (UpscaleNode.image.width < Config.getTextureResX()) {
+ if (UpscaleNode.image.width < config_getTextureResX()) {
UpscaleNode.image = UpscaleNode.esrgan(UpscaleNode.image);
- while (UpscaleNode.image.width < Config.getTextureResX()) {
+ while (UpscaleNode.image.width < config_getTextureResX()) {
let lastImage = UpscaleNode.image;
@@ -63,7 +63,7 @@ class UpscaleNode extends LogicNode {
f32a[i + size1w * size1w * 2] = (u8a[i * 4 + 2] / 255);
- let esrgan2x_buf = krom_ml_inference(UpscaleNode.esrgan_blob, [f32a.buffer], [[1, 3, size1w, size1h]], [1, 3, size2w, size2h], Config.raw.gpu_inference);
+ let esrgan2x_buf = krom_ml_inference(UpscaleNode.esrgan_blob, [f32a.buffer], [[1, 3, size1w, size1h]], [1, 3, size2w, size2h], config_raw.gpu_inference);
let esrgan2x = new Float32Array(esrgan2x_buf);
for (let i = 0; i < esrgan2x.length; ++i) {
if (esrgan2x[i] < 0) esrgan2x[i] = 0;
@@ -40,10 +40,10 @@ class VarianceNode extends LogicNode {
f32a[i + 512 * 512 * 2] = (u8a[i * 4 + 2] / 255) * 2.0 - 1.0;
- Console.progress(tr("Processing") + " - " + tr("Variance"));
+ console_progress(tr("Processing") + " - " + tr("Variance"));
let vae_encoder_blob: ArrayBuffer = data_get_blob("models/sd_vae_encoder.quant.onnx");
class ImportFolder {
static run = (path: string) => {
- let files: string[] = File.read_directory(path);
+ let files: string[] = file_read_directory(path);
let mapbase: string = "";
let mapopac: string = "";
let mapnor: string = "";
@@ -14,58 +14,58 @@ class ImportFolder {
let found_texture: bool = false;
// Import maps
for (let f of files) {
- if (!Path.is_texture(f)) continue;
+ if (!path_is_texture(f)) continue;
// TODO: handle -albedo
let base: string = f.substr(0, f.lastIndexOf(".")).toLowerCase();
let valid: bool = false;
- if (mapbase == "" && Path.is_base_color_tex(base)) {
+ if (mapbase == "" && path_is_base_color_tex(base)) {
mapbase = f;
valid = true;
- if (mapopac == "" && Path.is_opacity_tex(base)) {
+ if (mapopac == "" && path_is_opacity_tex(base)) {
mapopac = f;
- if (mapnor == "" && Path.is_normal_map_tex(base)) {
+ if (mapnor == "" && path_is_normal_map_tex(base)) {
mapnor = f;
- if (mapocc == "" && Path.is_occlusion_tex(base)) {
+ if (mapocc == "" && path_is_occlusion_tex(base)) {
mapocc = f;
- if (maprough == "" && Path.is_roughness_tex(base)) {
+ if (maprough == "" && path_is_roughness_tex(base)) {
maprough = f;
- if (mapmet == "" && Path.is_metallic_tex(base)) {
+ if (mapmet == "" && path_is_metallic_tex(base)) {
mapmet = f;
- if (mapheight == "" && Path.is_displacement_tex(base)) {
+ if (mapheight == "" && path_is_displacement_tex(base)) {
mapheight = f;
if (valid) {
- ImportTexture.run(path + Path.sep + f, false);
+ ImportTexture.run(path + path_sep + f, false);
found_texture = true;
if (!found_texture) {
- Console.info(tr("Folder does not contain textures"));
+ console_info(tr("Folder does not contain textures"));
// Create material
- Context.raw.material = SlotMaterial.create(Project.materials[0].data);
- Project.materials.push(Context.raw.material);
- let nodes: zui_nodes_t = Context.raw.material.nodes;
- let canvas: zui_node_canvas_t = Context.raw.material.canvas;
- let dirs: string[] = path.split(Path.sep);
+ context_raw.material = SlotMaterial.create(project_materials[0].data);
+ project_materials.push(context_raw.material);
+ let nodes: zui_nodes_t = context_raw.material.nodes;
+ let canvas: zui_node_canvas_t = context_raw.material.canvas;
+ let dirs: string[] = path.split(path_sep);
canvas.name = dirs[dirs.length - 1];
let nout: zui_node_t = null;
for (let n of canvas.nodes) {
@@ -117,7 +117,7 @@ class ImportFolder {
MakeMaterial.parse_paint_material();
UtilRender.make_material_preview();
UIBase.hwnds[1].redraws = 2;
- History.new_material();
+ history_new_material();
static place_image_node = (nodes: zui_nodes_t, canvas: zui_node_canvas_t, asset: string, ny: i32, to_id: i32, to_socket: i32) => {
class MakeBake {
static run = (con: NodeShaderContextRaw, vert: NodeShaderRaw, frag: NodeShaderRaw) => {
- if (Context.raw.bake_type == bake_type_t.AO) { // Voxel
+ if (context_raw.bake_type == bake_type_t.AO) { // Voxel
// Apply normal channel
@@ -23,23 +23,23 @@ class MakeBake {
NodeShader.add_uniform(frag, 'sampler3D voxels');
NodeShader.add_function(frag, ShaderFunctions.str_trace_ao);
frag.n = true;
- let strength: f32 = Context.raw.bake_ao_strength;
- let radius: f32 = Context.raw.bake_ao_radius;
- let offset: f32 = Context.raw.bake_ao_offset;
+ let strength: f32 = context_raw.bake_ao_strength;
+ let radius: f32 = context_raw.bake_ao_radius;
+ let offset: f32 = context_raw.bake_ao_offset;
NodeShader.write(frag, `float ao = traceAO(voxpos, n, ${radius}, ${offset}) * ${strength};`);
- if (Context.raw.bake_axis != bake_axis_t.XYZ) {
- let axis: string = MakeBake.axis_string(Context.raw.bake_axis);
+ if (context_raw.bake_axis != bake_axis_t.XYZ) {
+ let axis: string = MakeBake.axis_string(context_raw.bake_axis);
NodeShader.write(frag, `ao *= dot(n, ${axis});`);
NodeShader.write(frag, 'ao = 1.0 - ao;');
NodeShader.write(frag, 'fragColor[0] = vec4(ao, ao, ao, 1.0);');
- else if (Context.raw.bake_type == bake_type_t.CURVATURE) {
+ else if (context_raw.bake_type == bake_type_t.CURVATURE) {
let pass: bool = ParserMaterial.bake_passthrough;
- let strength: string = pass ? ParserMaterial.bake_passthrough_strength : Context.raw.bake_curv_strength + "";
- let radius: string = pass ? ParserMaterial.bake_passthrough_radius : Context.raw.bake_curv_radius + "";
- let offset: string = pass ? ParserMaterial.bake_passthrough_offset : Context.raw.bake_curv_offset + "";
+ let strength: string = pass ? ParserMaterial.bake_passthrough_strength : context_raw.bake_curv_strength + "";
+ let radius: string = pass ? ParserMaterial.bake_passthrough_radius : context_raw.bake_curv_radius + "";
+ let offset: string = pass ? ParserMaterial.bake_passthrough_offset : context_raw.bake_curv_offset + "";
strength = `float(${strength})`;
radius = `float(${radius})`;
offset = `float(${offset})`;
@@ -48,13 +48,13 @@ class MakeBake {
NodeShader.write(frag, 'vec3 dy = dFdy(n);');
NodeShader.write(frag, 'float curvature = max(dot(dx, dx), dot(dy, dy));');
NodeShader.write(frag, 'curvature = clamp(pow(curvature, (1.0 / ' + radius + ') * 0.25) * ' + strength + ' * 2.0 + ' + offset + ' / 10.0, 0.0, 1.0);');
NodeShader.write(frag, `curvature *= dot(n, ${axis});`);
NodeShader.write(frag, 'fragColor[0] = vec4(curvature, curvature, curvature, 1.0);');
- else if (Context.raw.bake_type == bake_type_t.NORMAL) { // Tangent
+ else if (context_raw.bake_type == bake_type_t.NORMAL) { // Tangent
NodeShader.add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo'); // Baked high-poly normals
NodeShader.write(frag, 'vec3 n0 = textureLod(texpaint_undo, texCoord, 0.0).rgb * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);');
@@ -63,21 +63,21 @@ class MakeBake {
NodeShader.write(frag, 'vec3 res = normalize(mul(n0, invTBN)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);');
NodeShader.write(frag, 'fragColor[0] = vec4(res, 1.0);');
- else if (Context.raw.bake_type == bake_type_t.NORMAL_OBJECT) {
+ else if (context_raw.bake_type == bake_type_t.NORMAL_OBJECT) {
NodeShader.write(frag, 'fragColor[0] = vec4(n * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), 1.0);');
- if (Context.raw.bake_up_axis == bake_up_axis_t.Y) {
+ if (context_raw.bake_up_axis == bake_up_axis_t.Y) {
NodeShader.write(frag, 'fragColor[0].rgb = vec3(fragColor[0].r, fragColor[0].b, 1.0 - fragColor[0].g);');
- else if (Context.raw.bake_type == bake_type_t.HEIGHT) {
+ else if (context_raw.bake_type == bake_type_t.HEIGHT) {
NodeShader.add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo'); // Baked high-poly positions
NodeShader.write(frag, 'vec3 wpos0 = textureLod(texpaint_undo, texCoord, 0.0).rgb * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);');
NodeShader.write(frag, 'float res = distance(wpos0, wposition) * 10.0;');
NodeShader.write(frag, 'fragColor[0] = vec4(res, res, res, 1.0);');
- else if (Context.raw.bake_type == bake_type_t.DERIVATIVE) {
+ else if (context_raw.bake_type == bake_type_t.DERIVATIVE) {
NodeShader.add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo'); // Baked height
NodeShader.write(frag, 'vec2 texDx = dFdx(texCoord);');
NodeShader.write(frag, 'vec2 texDy = dFdy(texCoord);');
@@ -86,17 +86,17 @@ class MakeBake {
NodeShader.write(frag, 'float h2 = textureLod(texpaint_undo, texCoord + texDy, 0.0).r * 100;');
NodeShader.write(frag, 'fragColor[0] = vec4((h1 - h0) * 0.5 + 0.5, (h2 - h0) * 0.5 + 0.5, 0.0, 1.0);');
- else if (Context.raw.bake_type == bake_type_t.POSITION) {
+ else if (context_raw.bake_type == bake_type_t.POSITION) {
NodeShader.write(frag, 'fragColor[0] = vec4(wposition * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), 1.0);');
- else if (Context.raw.bake_type == bake_type_t.TEXCOORD) {
+ else if (context_raw.bake_type == bake_type_t.TEXCOORD) {
NodeShader.write(frag, 'fragColor[0] = vec4(texCoord.xy, 0.0, 1.0);');
- else if (Context.raw.bake_type == bake_type_t.MATERIALID) {
+ else if (context_raw.bake_type == bake_type_t.MATERIALID) {
NodeShader.write(frag, 'float sample_matid = textureLod(texpaint_nor_undo, texCoord, 0.0).a + 1.0 / 255.0;');
NodeShader.write(frag, 'float matid_r = fract(sin(dot(vec2(sample_matid, sample_matid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);');
@@ -104,7 +104,7 @@ class MakeBake {
NodeShader.write(frag, 'float matid_b = fract(sin(dot(vec2(sample_matid, sample_matid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);');
NodeShader.write(frag, 'fragColor[0] = vec4(matid_r, matid_g, matid_b, 1.0);');
- else if (Context.raw.bake_type == bake_type_t.OBJECTID) {
+ else if (context_raw.bake_type == bake_type_t.OBJECTID) {
NodeShader.add_uniform(frag, 'float objectId', '_objectId');
NodeShader.write(frag, 'float obid = objectId + 1.0 / 255.0;');
NodeShader.write(frag, 'float id_r = fract(sin(dot(vec2(obid, obid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);');
@@ -112,7 +112,7 @@ class MakeBake {
NodeShader.write(frag, 'float id_b = fract(sin(dot(vec2(obid, obid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);');
NodeShader.write(frag, 'fragColor[0] = vec4(id_r, id_g, id_b, 1.0);');
- else if (Context.raw.bake_type == bake_type_t.VERTEX_COLOR) {
+ else if (context_raw.bake_type == bake_type_t.VERTEX_COLOR) {
if (con.allow_vcols) {
NodeShaderContext.add_elem(con, "col", "short4norm");
NodeShader.write(frag, 'fragColor[0] = vec4(vcolor.r, vcolor.g, vcolor.b, 1.0);');
@@ -15,23 +15,23 @@ class MakeBlur {
NodeShader.write(frag, 'vec3 nortan = vec3(0.0, 0.0, 0.0);');
NodeShader.write(frag, 'float height = 0.0;');
NodeShader.write(frag, 'float mat_opacity = 1.0;');
- let is_mask: bool = SlotLayer.is_mask(Context.raw.layer);
+ let is_mask: bool = SlotLayer.is_mask(context_raw.layer);
if (is_mask) {
NodeShader.write(frag, 'float opacity = 1.0;');
NodeShader.write(frag, 'float opacity = 0.0;');
- if (Context.raw.material.paint_emis) {
+ if (context_raw.material.paint_emis) {
NodeShader.write(frag, 'float emis = 0.0;');
- if (Context.raw.material.paint_subs) {
+ if (context_raw.material.paint_subs) {
NodeShader.write(frag, 'float subs = 0.0;');
NodeShader.add_uniform(frag, 'vec2 texpaintSize', '_texpaintSize');
NodeShader.write(frag, 'float blur_step = 1.0 / texpaintSize.x;');
- if (Context.raw.tool == workspace_tool_t.SMUDGE) {
+ if (context_raw.tool == workspace_tool_t.SMUDGE) {
///if (krom_direct3d11 || krom_direct3d12 || krom_metal)
NodeShader.write(frag, 'const float blur_weight[7] = {1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0};');
///else
@@ -5,13 +5,13 @@ class MakeBrush {
- if (Context.raw.tool == workspace_tool_t.PARTICLE) return;
+ if (context_raw.tool == workspace_tool_t.PARTICLE) return;
- let fill_layer: bool = Context.raw.layer.fill_layer != null;
- let decal: bool = Context.raw.tool == workspace_tool_t.DECAL || Context.raw.tool == workspace_tool_t.TEXT;
+ let fill_layer: bool = context_raw.layer.fill_layer != null;
+ let decal: bool = context_raw.tool == workspace_tool_t.DECAL || context_raw.tool == workspace_tool_t.TEXT;
if (decal && !fill_layer) NodeShader.write(frag, 'if (decalMask.z > 0.0) {');
- if (Config.raw.brush_3d) {
+ if (config_raw.brush_3d) {
///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
NodeShader.write(frag, 'float depth = textureLod(gbufferD, inp.xy, 0.0).r;');
@@ -24,7 +24,7 @@ class MakeBrush {
NodeShader.write(frag, 'winp.xyz /= winp.w;');
- if (Config.raw.brush_angle_reject || Context.raw.xray) {
+ if (config_raw.brush_angle_reject || context_raw.xray) {
NodeShader.add_function(frag, ShaderFunctions.str_octahedron_wrap);
NodeShader.add_uniform(frag, 'sampler2D gbuffer0');
@@ -38,10 +38,10 @@ class MakeBrush {
NodeShader.write(frag, 'wn = normalize(wn);');
NodeShader.write(frag, 'float planeDist = dot(wn, winp.xyz - wposition);');
- if (Config.raw.brush_angle_reject && !Context.raw.xray) {
+ if (config_raw.brush_angle_reject && !context_raw.xray) {
NodeShader.write(frag, 'if (planeDist < -0.01) discard;');
- let angle: f32 = Context.raw.brush_angle_reject_dot;
+ let angle: f32 = context_raw.brush_angle_reject_dot;
NodeShader.write(frag, `if (dot(wn, n) < ${angle}) discard;`);
@@ -57,12 +57,12 @@ class MakeBrush {
NodeShader.write(frag, 'winplast.xyz /= winplast.w;');
NodeShader.write(frag, 'vec3 pa = wposition - winp.xyz;');
- if (Context.raw.xray) {
+ if (context_raw.xray) {
NodeShader.write(frag, 'pa += wn * vec3(planeDist, planeDist, planeDist);');
NodeShader.write(frag, 'vec3 ba = winplast.xyz - winp.xyz;');
- if (Context.raw.brush_lazy_radius > 0 && Context.raw.brush_lazy_step > 0) {
+ if (context_raw.brush_lazy_radius > 0 && context_raw.brush_lazy_step > 0) {
// Sphere
NodeShader.write(frag, 'dist = distance(wposition, winp.xyz);');
@@ -25,10 +25,10 @@ class MakeClone {
NodeShader.write(frag, `float height = ${height};`);
NodeShader.write(frag, `float mat_opacity = ${opac};`);
NodeShader.write(frag, 'float opacity = mat_opacity * brushOpacity;');
@@ -15,14 +15,14 @@ class MakeColorIdPicker {
NodeShader.write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, (1.0 - inp.y) * gbufferSize.y), 0).ba;');
- if (Context.raw.tool == workspace_tool_t.COLORID) {
+ if (context_raw.tool == workspace_tool_t.COLORID) {
NodeShader.add_out(frag, 'vec4 fragColor');
NodeShader.add_uniform(frag, 'sampler2D texcolorid', '_texcolorid');
NodeShader.write(frag, 'vec3 idcol = textureLod(texcolorid, texCoordInp, 0.0).rgb;');
NodeShader.write(frag, 'fragColor = vec4(idcol, 1.0);');
- else if (Context.raw.tool == workspace_tool_t.PICKER || Context.raw.tool == workspace_tool_t.MATERIAL) {
- if (Context.raw.pick_pos_nor_tex) {
+ else if (context_raw.tool == workspace_tool_t.PICKER || context_raw.tool == workspace_tool_t.MATERIAL) {
+ if (context_raw.pick_pos_nor_tex) {
NodeShader.add_out(frag, 'vec4 fragColor[2]');
NodeShader.add_uniform(frag, 'sampler2D gbufferD');
NodeShader.add_uniform(frag, 'mat4 invVP', '_inv_view_proj_matrix');
@@ -44,7 +44,7 @@ class MakeDiscard {
NodeShader.write(frag, 'picker_sample_tc.y = 1.0 - picker_sample_tc.y;');
- let matid: i32 = Context.raw.materialid_picked / 255;
+ let matid: i32 = context_raw.materialid_picked / 255;
NodeShader.write(frag, `if (${matid} != textureLod(texpaint_nor_undo, picker_sample_tc, 0.0).a) discard;`);
@@ -14,7 +14,7 @@ class MakeMaterial {
static parse_mesh_material = () => {
- let m: material_data_t = Project.materials[0].data;
+ let m: material_data_t = project_materials[0].data;
@@ -63,7 +63,7 @@ class MakeMaterial {
let sampler: string = con.frag.shared_samplers[0];
- if (!Context.raw.texture_filter) {
+ if (!context_raw.texture_filter) {
@@ -77,7 +77,7 @@ class MakeMaterial {
@@ -89,7 +89,7 @@ class MakeMaterial {
m._.contexts.push(mcon);
MakeMaterial.make_voxel(m);
@@ -101,7 +101,7 @@ class MakeMaterial {
static parse_particle_material = () => {
- let m: material_data_t = Context.raw.particle_material;
+ let m: material_data_t = context_raw.particle_material;
let sc: shader_context_t = null;
@@ -123,7 +123,7 @@ class MakeMaterial {
static parse_mesh_preview_material = (md: material_data_t = null) => {
if (!MakeMaterial.get_mout()) return;
- let m: material_data_t = md == null ? Project.materials[0].data : md;
+ let m: material_data_t = md == null ? project_materials[0].data : md;
@@ -162,7 +162,7 @@ class MakeMaterial {
static make_voxel = (m: material_data_t) => {
let rebuild: bool = MakeMaterial.height_used;
@@ -170,7 +170,7 @@ class MakeMaterial {
@@ -185,7 +185,7 @@ class MakeMaterial {
if (current != null) g2_begin(current);
// let scon: TShaderContext = null;
// let mcon: TMaterialContext = null;
@@ -228,14 +228,14 @@ class MakeMaterial {
static bake_node_previews = () => {
- Context.raw.node_previews_used = [];
- if (Context.raw.node_previews == null) Context.raw.node_previews = new Map();
+ context_raw.node_previews_used = [];
+ if (context_raw.node_previews == null) context_raw.node_previews = new Map();
MakeMaterial.traverse_nodes(UINodes.get_canvas_material().nodes, null, []);
- for (let key of Context.raw.node_previews.keys()) {
- if (Context.raw.node_previews_used.indexOf(key) == -1) {
- let image: image_t = Context.raw.node_previews.get(key);
+ for (let key of context_raw.node_previews.keys()) {
+ if (context_raw.node_previews_used.indexOf(key) == -1) {
+ let image: image_t = context_raw.node_previews.get(key);
base_notify_on_next_frame(function() { image_unload(image); });
- Context.raw.node_previews.delete(key);
+ context_raw.node_previews.delete(key);
@@ -244,7 +244,7 @@ class MakeMaterial {
for (let node of nodes) {
MakeMaterial.bake_node_preview(node, group, parents);
if (node.type == "GROUP") {
- for (let g of Project.material_groups) {
+ for (let g of project_material_groups) {
if (g.canvas.name == node.name) {
parents.push(node);
MakeMaterial.traverse_nodes(g.canvas.nodes, g.canvas, parents);
@@ -259,14 +259,14 @@ class MakeMaterial {
static bake_node_preview = (node: zui_node_t, group: zui_node_canvas_t, parents: zui_node_t[]) => {
if (node.type == "BLUR") {
let id: string = ParserMaterial.node_name(node, parents);
- let image: image_t = Context.raw.node_previews.get(id);
- Context.raw.node_previews_used.push(id);
- let resX: i32 = Math.floor(Config.get_texture_res_x() / 4);
- let resY: i32 = Math.floor(Config.get_texture_res_y() / 4);
+ let image: image_t = context_raw.node_previews.get(id);
+ context_raw.node_previews_used.push(id);
+ let resX: i32 = Math.floor(config_get_texture_res_x() / 4);
+ let resY: i32 = Math.floor(config_get_texture_res_y() / 4);
if (image == null || image.width != resX || image.height != resY) {
if (image != null) image_unload(image);
image = image_create_render_target(resX, resY);
- Context.raw.node_previews.set(id, image);
+ context_raw.node_previews.set(id, image);
ParserMaterial.blur_passthrough = true;
@@ -275,14 +275,14 @@ class MakeMaterial {
else if (node.type == "DIRECT_WARP") {
- let resX: i32 = Math.floor(Config.get_texture_res_x());
- let resY: i32 = Math.floor(Config.get_texture_res_y());
+ let resX: i32 = Math.floor(config_get_texture_res_x());
+ let resY: i32 = Math.floor(config_get_texture_res_y());
ParserMaterial.warp_passthrough = true;
@@ -291,14 +291,14 @@ class MakeMaterial {
else if (node.type == "BAKE_CURVATURE") {
image = image_create_render_target(resX, resY, tex_format_t.R8);
if (RenderPathPaint.live_layer == null) {
@@ -306,11 +306,11 @@ class MakeMaterial {
let _space: i32 = UIHeader.worktab.position;
- let _tool: workspace_tool_t = Context.raw.tool;
- let _bake_type: bake_type_t = Context.raw.bake_type;
+ let _tool: workspace_tool_t = context_raw.tool;
+ let _bake_type: bake_type_t = context_raw.bake_type;
UIHeader.worktab.position = space_type_t.SPACE3D;
- Context.raw.tool = workspace_tool_t.BAKE;
- Context.raw.bake_type = bake_type_t.CURVATURE;
+ context_raw.tool = workspace_tool_t.BAKE;
+ context_raw.bake_type = bake_type_t.CURVATURE;
ParserMaterial.bake_passthrough = true;
ParserMaterial.start_node = node;
@@ -321,16 +321,16 @@ class MakeMaterial {
ParserMaterial.start_node = null;
ParserMaterial.start_group = null;
ParserMaterial.start_parents = null;
- Context.raw.pdirty = 1;
+ context_raw.pdirty = 1;
RenderPathPaint.use_live_layer(true);
RenderPathPaint.commands_paint(false);
RenderPathPaint.dilate(true, false);
RenderPathPaint.use_live_layer(false);
- Context.raw.pdirty = 0;
+ context_raw.pdirty = 0;
UIHeader.worktab.position = _space;
- Context.raw.tool = _tool;
- Context.raw.bake_type = _bake_type;
+ context_raw.tool = _tool;
+ context_raw.bake_type = _bake_type;
MakeMaterial.parse_paint_material(false);
let rts: Map<string, render_target_t> = render_path_render_targets;
@@ -358,7 +358,7 @@ class MakeMaterial {
static parse_brush = () => {
- ParserLogic.parse(Context.raw.brush.canvas);
+ ParserLogic.parse(context_raw.brush.canvas);
static blend_mode = (frag: NodeShaderRaw, blending: i32, cola: string, colb: string, opac: string): string => {
@@ -475,12 +475,12 @@ class MakeMaterial {
static get_displace_strength = (): f32 => {
- let sc: f32 = Context.main_object().base.transform.scale.x;
+ let sc: f32 = context_main_object().base.transform.scale.x;
static voxelgi_half_extents = (): string => {
- let ext: f32 = Context.raw.vxao_ext;
+ let ext: f32 = context_raw.vxao_ext;
@@ -9,7 +9,7 @@ class MakeMesh {
name: context_id,
- cull_mode: (Context.raw.cull_backfaces || layerPass > 0) ? "clockwise" : "none",
+ cull_mode: (context_raw.cull_backfaces || layerPass > 0) ? "clockwise" : "none",
@@ -32,7 +32,7 @@ class MakeMesh {
vert.n = true;
NodeShader.write(vert, 'float height = 0.0;');
let num_layers: i32 = 0;
- for (let l of Project.layers) {
+ for (let l of project_layers) {
if (!SlotLayer.is_visible(l) || !l.paint_height || !SlotLayer.is_layer(l)) continue;
if (num_layers > 16) break;
num_layers++;
@@ -66,7 +66,7 @@ class MakeMesh {
NodeShader.add_function(frag, ShaderFunctions.str_pack_float_int16);
texture_count++;
NodeShader.write(frag, 'fragColor[0] = vec4(n.xy, 1.0, packFloatInt16(0.0, uint(0)));');
@@ -118,20 +118,20 @@ class MakeMesh {
- if (Context.raw.draw_wireframe) {
+ if (context_raw.draw_wireframe) {
NodeShader.add_uniform(frag, 'sampler2D texuvmap', '_texuvmap');
- if (Context.raw.viewport_mode == viewport_mode_t.MASK && SlotLayer.get_masks(Context.raw.layer) != null) {
- for (let m of SlotLayer.get_masks(Context.raw.layer)) {
+ if (context_raw.viewport_mode == viewport_mode_t.MASK && SlotLayer.get_masks(context_raw.layer) != null) {
+ for (let m of SlotLayer.get_masks(context_raw.layer)) {
if (!SlotLayer.is_visible(m)) continue;
- NodeShader.add_uniform(frag, 'sampler2D texpaint_view_mask' + m.id, '_texpaint' + Project.layers.indexOf(m));
+ NodeShader.add_uniform(frag, 'sampler2D texpaint_view_mask' + m.id, '_texpaint' + project_layers.indexOf(m));
- if (Context.raw.viewport_mode == viewport_mode_t.LIT && Context.raw.render_mode == render_mode_t.FORWARD) {
+ if (context_raw.viewport_mode == viewport_mode_t.LIT && context_raw.render_mode == render_mode_t.FORWARD) {
texture_count += 4;
@@ -143,9 +143,9 @@ class MakeMesh {
MakeMesh.layer_pass_count = 1;
let layers: SlotLayerRaw[] = [];
let start_count: i32 = texture_count;
- let is_material_tool: bool = Context.raw.tool == workspace_tool_t.MATERIAL;
- if (is_material_tool && l != Context.raw.layer) continue;
+ let is_material_tool: bool = context_raw.tool == workspace_tool_t.MATERIAL;
+ if (is_material_tool && l != context_raw.layer) continue;
if (!SlotLayer.is_layer(l) || !SlotLayer.is_visible(l)) continue;
let count: i32 = 3;
@@ -166,8 +166,8 @@ class MakeMesh {
for (let l of layers) {
if (SlotLayer.get_object_mask(l) > 0) {
NodeShader.add_uniform(frag, 'int uid', '_uid');
- if (SlotLayer.get_object_mask(l) > Project.paint_objects.length) { // Atlas
- let visibles: mesh_object_t[] = Project.get_atlas_objects(SlotLayer.get_object_mask(l));
+ if (SlotLayer.get_object_mask(l) > project_paint_objects.length) { // Atlas
+ let visibles: mesh_object_t[] = project_get_atlas_objects(SlotLayer.get_object_mask(l));
NodeShader.write(frag, 'if (');
for (let i: i32 = 0; i < visibles.length; ++i) {
if (i > 0) NodeShader.write(frag, ' || ');
@@ -176,7 +176,7 @@ class MakeMesh {
NodeShader.write(frag, ') {');
else { // Object mask
- let uid: i32 = Project.paint_objects[SlotLayer.get_object_mask(l) - 1].base.uid;
+ let uid: i32 = project_paint_objects[SlotLayer.get_object_mask(l) - 1].base.uid;
NodeShader.write(frag, `if (${uid} == uid) {`);
@@ -185,7 +185,7 @@ class MakeMesh {
NodeShader.write(frag, 'texpaint_sample = textureLodShared(texpaint' + l.id + ', texCoord, 0.0);');
NodeShader.write(frag, 'texpaint_opac = texpaint_sample.a;');
// ///if (krom_direct3d12 || krom_vulkan)
- // if (Context.raw.viewportMode == ViewLit) {
+ // if (raw.viewportMode == ViewLit) {
// NodeShader.write(frag, 'if (texpaint_opac < 0.1) discard;');
// }
@@ -219,7 +219,7 @@ class MakeMesh {
if (l.paint_base) {
- if (l == Project.layers[0]) {
+ if (l == project_layers[0]) {
NodeShader.write(frag, 'basecol = texpaint_sample.rgb * texpaint_opac;');
@@ -282,7 +282,7 @@ class MakeMesh {
- if (last_pass && Context.raw.draw_texels) {
+ if (last_pass && context_raw.draw_texels) {
NodeShader.write(frag, 'vec2 texel0 = texCoord * texpaintSize * 0.01;');
NodeShader.write(frag, 'vec2 texel1 = texCoord * texpaintSize * 0.1;');
@@ -292,7 +292,7 @@ class MakeMesh {
NodeShader.write(frag, 'basecol *= max(float(mod(int(texel2.x), 2.0) == mod(int(texel2.y), 2.0)), 0.9);');
- if (last_pass && Context.raw.draw_wireframe) {
+ if (last_pass && context_raw.draw_wireframe) {
NodeShader.write(frag, 'basecol *= 1.0 - textureLod(texuvmap, texCoord, 0.0).r;');
@@ -330,14 +330,14 @@ class MakeMesh {
- if (Context.raw.viewport_mode == viewport_mode_t.LIT || Context.raw.viewport_mode == viewport_mode_t.PATH_TRACE) {
+ if (context_raw.viewport_mode == viewport_mode_t.LIT || context_raw.viewport_mode == viewport_mode_t.PATH_TRACE) {
- if (Context.raw.viewport_shader != null) {
- let color: string = Context.raw.viewport_shader(frag);
+ if (context_raw.viewport_shader != null) {
+ let color: string = context_raw.viewport_shader(frag);
- else if (Context.raw.render_mode == render_mode_t.FORWARD && Context.raw.viewport_mode != viewport_mode_t.PATH_TRACE) {
+ else if (context_raw.render_mode == render_mode_t.FORWARD && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) {
@@ -387,52 +387,52 @@ class MakeMesh {
- else if (Context.raw.viewport_mode == viewport_mode_t.BASE_COLOR && Context.raw.layer.paint_base) {
+ else if (context_raw.viewport_mode == viewport_mode_t.BASE_COLOR && context_raw.layer.paint_base) {
- else if (Context.raw.viewport_mode == viewport_mode_t.NORMAL_MAP && Context.raw.layer.paint_nor) {
+ else if (context_raw.viewport_mode == viewport_mode_t.NORMAL_MAP && context_raw.layer.paint_nor) {
- else if (Context.raw.viewport_mode == viewport_mode_t.OCCLUSION && Context.raw.layer.paint_occ) {
+ else if (context_raw.viewport_mode == viewport_mode_t.OCCLUSION && context_raw.layer.paint_occ) {
- else if (Context.raw.viewport_mode == viewport_mode_t.ROUGHNESS && Context.raw.layer.paint_rough) {
+ else if (context_raw.viewport_mode == viewport_mode_t.ROUGHNESS && context_raw.layer.paint_rough) {
- else if (Context.raw.viewport_mode == viewport_mode_t.METALLIC && Context.raw.layer.paint_met) {
+ else if (context_raw.viewport_mode == viewport_mode_t.METALLIC && context_raw.layer.paint_met) {
- else if (Context.raw.viewport_mode == viewport_mode_t.OPACITY && Context.raw.layer.paint_opac) {
+ else if (context_raw.viewport_mode == viewport_mode_t.OPACITY && context_raw.layer.paint_opac) {
- else if (Context.raw.viewport_mode == viewport_mode_t.HEIGHT && Context.raw.layer.paint_height) {
+ else if (context_raw.viewport_mode == viewport_mode_t.HEIGHT && context_raw.layer.paint_height) {
- else if (Context.raw.viewport_mode == viewport_mode_t.EMISSION) {
+ else if (context_raw.viewport_mode == viewport_mode_t.EMISSION) {
NodeShader.write(frag, 'float emis = int(matid * 255.0) % 3 == 1 ? 1.0 : 0.0;');
NodeShader.write(frag, 'fragColor[1] = vec4(vec3(emis, emis, emis), 1.0);');
- else if (Context.raw.viewport_mode == viewport_mode_t.SUBSURFACE) {
+ else if (context_raw.viewport_mode == viewport_mode_t.SUBSURFACE) {
NodeShader.write(frag, 'float subs = int(matid * 255.0) % 3 == 2 ? 1.0 : 0.0;');
NodeShader.write(frag, 'fragColor[1] = vec4(vec3(subs, subs, subs), 1.0);');
- else if (Context.raw.viewport_mode == viewport_mode_t.TEXCOORD) {
+ else if (context_raw.viewport_mode == viewport_mode_t.TEXCOORD) {
NodeShader.write(frag, 'fragColor[1] = vec4(texCoord, 0.0, 1.0);');
- else if (Context.raw.viewport_mode == viewport_mode_t.OBJECT_NORMAL) {
+ else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_NORMAL) {
frag.nattr = true;
NodeShader.write(frag, 'fragColor[1] = vec4(nAttr, 1.0);');
- else if (Context.raw.viewport_mode == viewport_mode_t.MATERIAL_ID) {
- NodeShader.add_shared_sampler(frag, 'sampler2D texpaint_nor' + Context.raw.layer.id);
+ else if (context_raw.viewport_mode == viewport_mode_t.MATERIAL_ID) {
+ NodeShader.add_shared_sampler(frag, 'sampler2D texpaint_nor' + context_raw.layer.id);
- NodeShader.write(frag, 'float sample_matid = texelFetch(texpaint_nor' + Context.raw.layer.id + ', ivec2(texCoord * texpaintSize), 0).a + 1.0 / 255.0;');
+ NodeShader.write(frag, 'float sample_matid = texelFetch(texpaint_nor' + context_raw.layer.id + ', ivec2(texCoord * texpaintSize), 0).a + 1.0 / 255.0;');
NodeShader.write(frag, 'float matid_g = fract(sin(dot(vec2(sample_matid * 20.0, sample_matid), vec2(12.9898, 78.233))) * 43758.5453);');
NodeShader.write(frag, 'fragColor[1] = vec4(matid_r, matid_g, matid_b, 1.0);');
- else if (Context.raw.viewport_mode == viewport_mode_t.OBJECT_ID) {
+ else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_ID) {
@@ -440,13 +440,13 @@ class MakeMesh {
NodeShader.write(frag, 'fragColor[1] = vec4(id_r, id_g, id_b, 1.0);');
- else if (Context.raw.viewport_mode == viewport_mode_t.MASK && (SlotLayer.get_masks(Context.raw.layer) != null || SlotLayer.is_mask(Context.raw.layer))) {
- if (SlotLayer.is_mask(Context.raw.layer)) {
- NodeShader.write(frag, 'float mask_view = textureLodShared(texpaint' + Context.raw.layer.id + ', texCoord, 0.0).r;');
+ else if (context_raw.viewport_mode == viewport_mode_t.MASK && (SlotLayer.get_masks(context_raw.layer) != null || SlotLayer.is_mask(context_raw.layer))) {
+ if (SlotLayer.is_mask(context_raw.layer)) {
+ NodeShader.write(frag, 'float mask_view = textureLodShared(texpaint' + context_raw.layer.id + ', texCoord, 0.0).r;');
NodeShader.write(frag, 'float mask_view = 0.0;');
NodeShader.write(frag, 'float mask_sample' + m.id + ' = textureLodShared(texpaint_view_mask' + m.id + ', texCoord, 0.0).r;');
NodeShader.write(frag, 'mask_view = ' + MakeMaterial.blend_mode_mask(frag, m.blending, 'mask_view', 'mask_sample' + m.id, 'float(' + SlotLayer.get_opacity(m) + ')') + ';');
@@ -458,7 +458,7 @@ class MakeMesh {
- if (Context.raw.viewport_mode != viewport_mode_t.LIT && Context.raw.viewport_mode != viewport_mode_t.PATH_TRACE) {
+ if (context_raw.viewport_mode != viewport_mode_t.LIT && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) {
@@ -21,7 +21,7 @@ class MakeMeshPreview {
let pos: string = "pos";
///if arm_skin
- let skin: bool = mesh_data_get_vertex_array(Context.raw.paint_object.data, "bone") != null;
+ let skin: bool = mesh_data_get_vertex_array(context_raw.paint_object.data, "bone") != null;
if (skin) {
pos = "spos";
NodeShaderContext.add_elem(con_mesh, "bone", 'short4norm');
@@ -43,11 +43,11 @@ class MakeMeshPreview {
NodeShader.add_uniform(vert, 'mat4 WVP', '_world_view_proj_matrix');
NodeShader.write_attrib(vert, `gl_Position = mul(vec4(${pos}.xyz, 1.0), WVP);`);
- let brush_scale: string = (Context.raw.brush_scale * Context.raw.brush_nodes_scale) + "";
+ let brush_scale: string = (context_raw.brush_scale * context_raw.brush_nodes_scale) + "";
NodeShader.write_attrib(vert, `texCoord = tex * float(${brush_scale});`);
- let decal: bool = Context.raw.decal_preview;
+ let decal: bool = context_raw.decal_preview;
ParserMaterial.sample_keep_aspect = decal;
ParserMaterial.sample_uv_scale = brush_scale;
ParserMaterial.parse_height = MakeMaterial.height_used;
@@ -82,7 +82,7 @@ class MakeMeshPreview {
if (decal) {
- if (Context.raw.tool == workspace_tool_t.TEXT) {
+ if (context_raw.tool == workspace_tool_t.TEXT) {
NodeShader.add_uniform(frag, 'sampler2D textexttool', '_textexttool');
NodeShader.write(frag, `opacity *= textureLod(textexttool, texCoord / float(${brush_scale}), 0.0).r;`);
@@ -26,15 +26,15 @@ class MakeNodePreview {
ParserMaterial.init();
- ParserMaterial.canvases = [Context.raw.material.canvas];
- ParserMaterial.nodes = Context.raw.material.canvas.nodes;
- ParserMaterial.links = Context.raw.material.canvas.links;
+ ParserMaterial.canvases = [context_raw.material.canvas];
+ ParserMaterial.nodes = context_raw.material.canvas.nodes;
+ ParserMaterial.links = context_raw.material.canvas.links;
if (group != null) {
ParserMaterial.push_group(group);
ParserMaterial.parents = parents;
let links: zui_node_link_t[] = ParserMaterial.links;
- let link: zui_node_link_t = { id: zui_get_link_id(links), from_id: node.id, from_socket: Context.raw.node_preview_socket, to_id: -1, to_socket: -1 };
+ let link: zui_node_link_t = { id: zui_get_link_id(links), from_id: node.id, from_socket: context_raw.node_preview_socket, to_id: -1, to_socket: -1 };
links.push(link);
ParserMaterial.con = con_mesh;
@@ -5,7 +5,7 @@ class MakePaint {
static get is_raytraced_bake(): bool {
- return Context.raw.bake_type == bake_type_t.INIT;
+ return context_raw.bake_type == bake_type_t.INIT;
return false;
@@ -22,10 +22,10 @@ class MakePaint {
- Context.raw.tool == workspace_tool_t.COLORID ? ["RGBA32"] :
- (Context.raw.tool == workspace_tool_t.PICKER && Context.raw.pick_pos_nor_tex) ? ["RGBA128", "RGBA128"] :
- (Context.raw.tool == workspace_tool_t.PICKER || Context.raw.tool == workspace_tool_t.MATERIAL) ? ["RGBA32", "RGBA32", "RGBA32", "RGBA32"] :
- (Context.raw.tool == workspace_tool_t.BAKE && MakePaint.is_raytraced_bake) ? ["RGBA64", "RGBA64"] :
+ context_raw.tool == workspace_tool_t.COLORID ? ["RGBA32"] :
+ (context_raw.tool == workspace_tool_t.PICKER && context_raw.pick_pos_nor_tex) ? ["RGBA128", "RGBA128"] :
+ (context_raw.tool == workspace_tool_t.PICKER || context_raw.tool == workspace_tool_t.MATERIAL) ? ["RGBA32", "RGBA32", "RGBA32", "RGBA32"] :
+ (context_raw.tool == workspace_tool_t.BAKE && MakePaint.is_raytraced_bake) ? ["RGBA64", "RGBA64"] :
@@ -33,14 +33,14 @@ class MakePaint {
- con_paint.allow_vcols = mesh_data_get_vertex_array(Context.raw.paint_object.data, 'col') != null;
+ con_paint.allow_vcols = mesh_data_get_vertex_array(context_raw.paint_object.data, 'col') != null;
let vert: NodeShaderRaw = NodeShaderContext.make_vert(con_paint);
let frag: NodeShaderRaw = NodeShaderContext.make_frag(con_paint);
- if (Context.raw.tool == workspace_tool_t.BAKE && Context.raw.bake_type == bake_type_t.INIT) {
+ if (context_raw.tool == workspace_tool_t.BAKE && context_raw.bake_type == bake_type_t.INIT) {
// Init raytraced bake
MakeBake.position_normal(vert, frag);
con_paint.data.shader_from_source = true;
@@ -50,11 +50,11 @@ class MakePaint {
- if (Context.raw.tool == workspace_tool_t.BAKE) {
+ if (context_raw.tool == workspace_tool_t.BAKE) {
MakeBake.set_color_writes(con_paint);
- if (Context.raw.tool == workspace_tool_t.COLORID || Context.raw.tool == workspace_tool_t.PICKER || Context.raw.tool == workspace_tool_t.MATERIAL) {
+ if (context_raw.tool == workspace_tool_t.COLORID || context_raw.tool == workspace_tool_t.PICKER || context_raw.tool == workspace_tool_t.MATERIAL) {
MakeColorIdPicker.run(vert, frag);
con_paint.data.vertex_shader = NodeShader.get(vert);
@@ -62,9 +62,9 @@ class MakePaint {
return con_paint;
- let face_fill: bool = Context.raw.tool == workspace_tool_t.FILL && Context.raw.fill_type_handle.position == fill_type_t.FACE;
- let uv_island_fill: bool = Context.raw.tool == workspace_tool_t.FILL && Context.raw.fill_type_handle.position == fill_type_t.UV_ISLAND;
+ let face_fill: bool = context_raw.tool == workspace_tool_t.FILL && context_raw.fill_type_handle.position == fill_type_t.FACE;
+ let uv_island_fill: bool = context_raw.tool == workspace_tool_t.FILL && context_raw.fill_type_handle.position == fill_type_t.UV_ISLAND;
NodeShader.write(vert, 'vec2 tpos = vec2(tex.x * 2.0 - 1.0, (1.0 - tex.y) * 2.0 - 1.0);');
@@ -74,7 +74,7 @@ class MakePaint {
NodeShader.write(vert, 'gl_Position = vec4(tpos, 0.0, 1.0);');
- let decal_layer: bool = Context.raw.layer.fill_layer != null && Context.raw.layer.uv_type == uv_type_t.PROJECT;
+ let decal_layer: bool = context_raw.layer.fill_layer != null && context_raw.layer.uv_type == uv_type_t.PROJECT;
if (decal_layer) {
NodeShader.add_uniform(vert, 'mat4 WVP', '_decalLayerMatrix');
@@ -89,7 +89,7 @@ class MakePaint {
NodeShader.write_attrib(frag, 'sp.y = 1.0 - sp.y;');
NodeShader.write_attrib(frag, 'sp.z -= 0.0001;'); // small bias
- let uv_type: uv_type_t = Context.raw.layer.fill_layer != null ? Context.raw.layer.uv_type : Context.raw.brush_paint;
+ let uv_type: uv_type_t = context_raw.layer.fill_layer != null ? context_raw.layer.uv_type : context_raw.brush_paint;
if (uv_type == uv_type_t.PROJECT) frag.ndcpos = true;
NodeShader.add_uniform(frag, 'vec4 inp', '_inputBrush');
@@ -107,21 +107,21 @@ class MakePaint {
- if (Context.raw.tool == workspace_tool_t.BRUSH ||
- Context.raw.tool == workspace_tool_t.ERASER ||
- Context.raw.tool == workspace_tool_t.CLONE ||
- Context.raw.tool == workspace_tool_t.BLUR ||
- Context.raw.tool == workspace_tool_t.SMUDGE ||
- Context.raw.tool == workspace_tool_t.PARTICLE ||
+ if (context_raw.tool == workspace_tool_t.BRUSH ||
+ context_raw.tool == workspace_tool_t.ERASER ||
+ context_raw.tool == workspace_tool_t.CLONE ||
+ context_raw.tool == workspace_tool_t.BLUR ||
+ context_raw.tool == workspace_tool_t.SMUDGE ||
+ context_raw.tool == workspace_tool_t.PARTICLE ||
decal) {
- let depth_reject: bool = !Context.raw.xray;
- if (Config.raw.brush_3d && !Config.raw.brush_depth_reject) depth_reject = false;
+ let depth_reject: bool = !context_raw.xray;
+ if (config_raw.brush_3d && !config_raw.brush_depth_reject) depth_reject = false;
// TODO: sp.z needs to take height channel into account
- let particle: bool = Context.raw.tool == workspace_tool_t.PARTICLE;
- if (Config.raw.brush_3d && !decal && !particle) {
- if (MakeMaterial.height_used || Context.raw.sym_x || Context.raw.sym_y || Context.raw.sym_z) depth_reject = false;
+ let particle: bool = context_raw.tool == workspace_tool_t.PARTICLE;
+ if (config_raw.brush_3d && !decal && !particle) {
+ if (MakeMaterial.height_used || context_raw.sym_x || context_raw.sym_y || context_raw.sym_z) depth_reject = false;
if (depth_reject) {
@@ -136,7 +136,7 @@ class MakePaint {
else { // Fill, Bake
- let angle_fill: bool = Context.raw.tool == workspace_tool_t.FILL && Context.raw.fill_type_handle.position == fill_type_t.ANGLE;
+ let angle_fill: bool = context_raw.tool == workspace_tool_t.FILL && context_raw.fill_type_handle.position == fill_type_t.ANGLE;
if (angle_fill) {
@@ -146,10 +146,10 @@ class MakePaint {
NodeShader.write(frag, 'wn.xy = wn.z >= 0.0 ? g0.xy : octahedronWrap(g0.xy);');
- let stencil_fill: bool = Context.raw.tool == workspace_tool_t.FILL && Context.raw.brush_stencil_image != null;
+ let stencil_fill: bool = context_raw.tool == workspace_tool_t.FILL && context_raw.brush_stencil_image != null;
if (stencil_fill) {
NodeShader.write(frag, 'if (sp.z > textureLod(gbufferD, sp.xy, 0.0).r + 0.0005) discard;');
@@ -159,10 +159,10 @@ class MakePaint {
- if (Context.raw.colorid_picked || face_fill || uv_island_fill) {
+ if (context_raw.colorid_picked || face_fill || uv_island_fill) {
NodeShader.add_out(vert, 'vec2 texCoordPick');
NodeShader.write(vert, 'texCoordPick = tex;');
- if (Context.raw.colorid_picked) {
+ if (context_raw.colorid_picked) {
MakeDiscard.color_id(vert, frag);
if (face_fill) {
@@ -173,20 +173,20 @@ class MakePaint {
- if (Context.raw.picker_mask_handle.position == picker_mask_t.MATERIAL) {
+ if (context_raw.picker_mask_handle.position == picker_mask_t.MATERIAL) {
MakeDiscard.material_id(vert, frag);
MakeTexcoord.run(vert, frag);
- if (Context.raw.tool == workspace_tool_t.CLONE || Context.raw.tool == workspace_tool_t.BLUR || Context.raw.tool == workspace_tool_t.SMUDGE) {
+ if (context_raw.tool == workspace_tool_t.CLONE || context_raw.tool == workspace_tool_t.BLUR || context_raw.tool == workspace_tool_t.SMUDGE) {
- if (Context.raw.tool == workspace_tool_t.CLONE) {
+ if (context_raw.tool == workspace_tool_t.CLONE) {
MakeClone.run(vert, frag);
else { // Blur, Smudge
@@ -194,11 +194,11 @@ class MakePaint {
- ParserMaterial.parse_emission = Context.raw.material.paint_emis;
- ParserMaterial.parse_subsurface = Context.raw.material.paint_subs;
- ParserMaterial.parse_height = Context.raw.material.paint_height;
+ ParserMaterial.parse_emission = context_raw.material.paint_emis;
+ ParserMaterial.parse_subsurface = context_raw.material.paint_subs;
+ ParserMaterial.parse_height = context_raw.material.paint_height;
ParserMaterial.parse_height_as_channel = true;
ParserMaterial.triplanar = uv_type == uv_type_t.TRIPLANAR && !decal;
ParserMaterial.sample_uv_scale = 'brushScale';
@@ -224,13 +224,13 @@ class MakePaint {
NodeShader.write(frag, 'float opacity = mat_opacity;');
- if (Context.raw.layer.fill_layer == null) {
+ if (context_raw.layer.fill_layer == null) {
NodeShader.write(frag, 'opacity *= brushOpacity;');
NodeShader.write(frag, `float emis = ${emis};`);
NodeShader.write(frag, `float subs = ${subs};`);
if (parseFloat(height) != 0.0 && !MakeMaterial.height_used) {
@@ -242,29 +242,29 @@ class MakePaint {
if (parseFloat(subs) != 0.0) MakeMaterial.subs_used = true;
- if (Context.raw.brush_mask_image != null && Context.raw.tool == workspace_tool_t.DECAL) {
+ if (context_raw.brush_mask_image != null && context_raw.tool == workspace_tool_t.DECAL) {
NodeShader.add_uniform(frag, 'sampler2D texbrushmask', '_texbrushmask');
NodeShader.write(frag, 'vec4 mask_sample = textureLod(texbrushmask, uvsp, 0.0);');
- if (Context.raw.brush_mask_image_is_alpha) {
+ if (context_raw.brush_mask_image_is_alpha) {
NodeShader.write(frag, 'opacity *= mask_sample.a;');
NodeShader.write(frag, 'opacity *= mask_sample.r * mask_sample.a;');
- else if (Context.raw.tool == workspace_tool_t.TEXT) {
+ else if (context_raw.tool == workspace_tool_t.TEXT) {
NodeShader.write(frag, 'opacity *= textureLod(textexttool, uvsp, 0.0).r;');
- if (Context.raw.brush_stencil_image != null && (
- Context.raw.tool == workspace_tool_t.BRUSH ||
- Context.raw.tool == workspace_tool_t.FILL ||
+ if (context_raw.brush_stencil_image != null && (
+ context_raw.tool == workspace_tool_t.BRUSH ||
+ context_raw.tool == workspace_tool_t.FILL ||
decal)) {
NodeShader.add_uniform(frag, 'sampler2D texbrushstencil', '_texbrushstencil');
NodeShader.add_uniform(frag, 'vec4 stencilTransform', '_stencilTransform');
@@ -278,7 +278,7 @@ class MakePaint {
NodeShader.write(frag, 'stencil_uv.x *= stencil_ratio;');
NodeShader.write(frag, 'if (stencil_uv.x < 0 || stencil_uv.x > 1 || stencil_uv.y < 0 || stencil_uv.y > 1) discard;');
NodeShader.write(frag, 'vec4 texbrushstencil_sample = textureLod(texbrushstencil, stencil_uv, 0.0);');
- if (Context.raw.brush_stencil_image_is_alpha) {
+ if (context_raw.brush_stencil_image_is_alpha) {
NodeShader.write(frag, 'opacity *= texbrushstencil_sample.a;');
@@ -286,30 +286,30 @@ class MakePaint {
- if (Context.raw.brush_mask_image != null && (Context.raw.tool == workspace_tool_t.BRUSH || Context.raw.tool == workspace_tool_t.ERASER)) {
+ if (context_raw.brush_mask_image != null && (context_raw.tool == workspace_tool_t.BRUSH || context_raw.tool == workspace_tool_t.ERASER)) {
NodeShader.write(frag, 'vec2 binp_mask = inp.xy * 2.0 - 1.0;');
NodeShader.write(frag, 'binp_mask.x *= aspectRatio;');
NodeShader.write(frag, 'binp_mask = binp_mask * 0.5 + 0.5;');
NodeShader.write(frag, 'vec2 pa_mask = bsp.xy - binp_mask.xy;');
- if (Context.raw.brush_directional) {
+ if (context_raw.brush_directional) {
NodeShader.add_uniform(frag, 'vec3 brushDirection', '_brushDirection');
NodeShader.write(frag, 'if (brushDirection.z == 0.0) discard;');
NodeShader.write(frag, 'pa_mask = vec2(pa_mask.x * brushDirection.x - pa_mask.y * brushDirection.y, pa_mask.x * brushDirection.y + pa_mask.y * brushDirection.x);');
- let angle: f32 = Context.raw.brush_angle + Context.raw.brush_nodes_angle;
+ let angle: f32 = context_raw.brush_angle + context_raw.brush_nodes_angle;
if (angle != 0.0) {
NodeShader.add_uniform(frag, 'vec2 brushAngle', '_brushAngle');
NodeShader.write(frag, 'pa_mask.xy = vec2(pa_mask.x * brushAngle.x - pa_mask.y * brushAngle.y, pa_mask.x * brushAngle.y + pa_mask.y * brushAngle.x);');
NodeShader.write(frag, 'pa_mask /= brushRadius;');
NodeShader.add_uniform(frag, 'vec3 eye', '_camera_pos');
NodeShader.write(frag, 'pa_mask *= distance(eye, winp.xyz) / 1.5;');
NodeShader.write(frag, 'pa_mask = pa_mask.xy * 0.5 + 0.5;');
NodeShader.write(frag, 'vec4 mask_sample = textureLod(texbrushmask, pa_mask, 0.0);');
@@ -319,7 +319,7 @@ class MakePaint {
NodeShader.write(frag, 'if (opacity == 0.0) discard;');
- if (Context.raw.tool == workspace_tool_t.PARTICLE) { // Particle mask
+ if (context_raw.tool == workspace_tool_t.PARTICLE) { // Particle mask
MakeParticle.mask(vert, frag);
else { // Brush cursor mask
@@ -340,31 +340,31 @@ class MakePaint {
- let matid: f32 = Context.raw.material.id / 255;
- matid = Context.raw.materialid_picked / 255; // Keep existing material id in place when mask is set
+ let matid: f32 = context_raw.material.id / 255;
+ matid = context_raw.materialid_picked / 255; // Keep existing material id in place when mask is set
let matid_string: string = ParserMaterial.vec1(matid * 3.0);
NodeShader.write(frag, `float matid = ${matid_string};`);
// matid % 3 == 0 - normal, 1 - emission, 2 - subsurface
NodeShader.write(frag, 'if (emis > 0.0) {');
NodeShader.write(frag, ' matid += 1.0 / 255.0;');
NodeShader.write(frag, ' if (str == 0.0) discard;');
NodeShader.write(frag, '}');
- else if (Context.raw.material.paint_subs) {
+ else if (context_raw.material.paint_subs) {
NodeShader.write(frag, 'if (subs > 0.0) {');
NodeShader.write(frag, ' matid += 2.0 / 255.0;');
- let layered: bool = Context.raw.layer != Project.layers[0];
+ let layered: bool = context_raw.layer != project_layers[0];
if (layered && !is_mask) {
- if (Context.raw.tool == workspace_tool_t.ERASER) {
+ if (context_raw.tool == workspace_tool_t.ERASER) {
NodeShader.write(frag, 'fragColor[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);');
NodeShader.write(frag, 'nortan = vec3(0.5, 0.5, 1.0);');
NodeShader.write(frag, 'occlusion = 1.0;');
@@ -372,21 +372,21 @@ class MakePaint {
NodeShader.write(frag, 'metallic = 0.0;');
NodeShader.write(frag, 'matid = 0.0;');
- else if (Context.raw.tool == workspace_tool_t.PARTICLE || decal || Context.raw.brush_mask_image != null) {
- NodeShader.write(frag, 'fragColor[0] = vec4(' + MakeMaterial.blend_mode(frag, Context.raw.brush_blending, 'sample_undo.rgb', 'basecol', 'str') + ', max(str, sample_undo.a));');
+ else if (context_raw.tool == workspace_tool_t.PARTICLE || decal || context_raw.brush_mask_image != null) {
+ NodeShader.write(frag, 'fragColor[0] = vec4(' + MakeMaterial.blend_mode(frag, context_raw.brush_blending, 'sample_undo.rgb', 'basecol', 'str') + ', max(str, sample_undo.a));');
- if (Context.raw.layer.fill_layer != null) {
- NodeShader.write(frag, 'fragColor[0] = vec4(' + MakeMaterial.blend_mode(frag, Context.raw.brush_blending, 'sample_undo.rgb', 'basecol', 'opacity') + ', mat_opacity);');
+ if (context_raw.layer.fill_layer != null) {
+ NodeShader.write(frag, 'fragColor[0] = vec4(' + MakeMaterial.blend_mode(frag, context_raw.brush_blending, 'sample_undo.rgb', 'basecol', 'opacity') + ', mat_opacity);');
- NodeShader.write(frag, 'fragColor[0] = vec4(' + MakeMaterial.blend_mode(frag, Context.raw.brush_blending, 'sample_undo.rgb', 'basecol', 'opacity') + ', max(str, sample_undo.a));');
+ NodeShader.write(frag, 'fragColor[0] = vec4(' + MakeMaterial.blend_mode(frag, context_raw.brush_blending, 'sample_undo.rgb', 'basecol', 'opacity') + ', max(str, sample_undo.a));');
NodeShader.write(frag, 'fragColor[1] = vec4(nortan, matid);');
let height: string = "0.0";
- if (Context.raw.material.paint_height && MakeMaterial.height_used) {
+ if (context_raw.material.paint_height && MakeMaterial.height_used) {
height = "height";
@@ -400,7 +400,7 @@ class MakePaint {
NodeShader.write(frag, 'fragColor[2] = vec4(1.0, 0.0, 0.0, 0.0);');
@@ -410,9 +410,9 @@ class MakePaint {
NodeShader.write(frag, 'vec4 sample_nor_undo = textureLod(texpaint_nor_undo, sample_tc, 0.0);');
NodeShader.write(frag, 'vec4 sample_pack_undo = textureLod(texpaint_pack_undo, sample_tc, 0.0);');
NodeShader.write(frag, 'fragColor[1] = vec4(mix(sample_nor_undo.rgb, nortan, str), matid);');
NodeShader.write(frag, 'fragColor[2] = mix(sample_pack_undo, vec4(occlusion, roughness, metallic, height), str);');
@@ -422,29 +422,29 @@ class MakePaint {
NodeShader.write(frag, 'fragColor[3] = vec4(str, 0.0, 0.0, 1.0);');
- if (!Context.raw.material.paint_base) {
+ if (!context_raw.material.paint_base) {
con_paint.data.color_writes_red[0] = false;
con_paint.data.color_writes_green[0] = false;
con_paint.data.color_writes_blue[0] = false;
- if (!Context.raw.material.paint_opac) {
+ if (!context_raw.material.paint_opac) {
con_paint.data.color_writes_alpha[0] = false;
- if (!Context.raw.material.paint_nor) {
+ if (!context_raw.material.paint_nor) {
con_paint.data.color_writes_red[1] = false;
con_paint.data.color_writes_green[1] = false;
con_paint.data.color_writes_blue[1] = false;
- if (!Context.raw.material.paint_occ) {
+ if (!context_raw.material.paint_occ) {
con_paint.data.color_writes_red[2] = false;
- if (!Context.raw.material.paint_rough) {
+ if (!context_raw.material.paint_rough) {
con_paint.data.color_writes_green[2] = false;
- if (!Context.raw.material.paint_met) {
+ if (!context_raw.material.paint_met) {
con_paint.data.color_writes_blue[2] = false;
- if (!Context.raw.material.paint_height) {
+ if (!context_raw.material.paint_height) {
con_paint.data.color_writes_alpha[2] = false;
@@ -465,7 +465,7 @@ class MakePaint {
MakeBake.run(con_paint, vert, frag);
@@ -87,7 +87,7 @@ class MakeParticle {
static mask = (vert: NodeShaderRaw, frag: NodeShaderRaw) => {
///if arm_physics
- if (Context.raw.particle_physics) {
+ if (context_raw.particle_physics) {
NodeShader.add_out(vert, 'vec4 wpos');
NodeShader.add_uniform(vert, 'mat4 W', '_world_matrix');
NodeShader.write_attrib(vert, 'wpos = mul(vec4(pos.xyz, 1.0), W);');
@@ -3,11 +3,11 @@ class MakeTexcoord {
static run = (vert: NodeShaderRaw, frag: NodeShaderRaw) => {
- let uv_type: uv_type_t = fill_layer ? Context.raw.layer.uv_type : Context.raw.brush_paint;
- let uvAngle: f32 = fill_layer ? Context.raw.layer.angle : angle;
+ let uv_type: uv_type_t = fill_layer ? context_raw.layer.uv_type : context_raw.brush_paint;
+ let uvAngle: f32 = fill_layer ? context_raw.layer.angle : angle;
if (uv_type == uv_type_t.PROJECT || decal) { // TexCoords - project
NodeShader.add_uniform(frag, 'float brushScale', '_brushScale');
@@ -23,7 +23,7 @@ class MakeTexcoord {
NodeShader.add_uniform(frag, 'vec3 decalLayerNor', '_decalLayerNor');
- let dot_angle: f32 = Context.raw.brush_angle_reject_dot;
+ let dot_angle: f32 = context_raw.brush_angle_reject_dot;
NodeShader.write(frag, `if (abs(dot(n, decalLayerNor) - 1.0) > ${dot_angle}) discard;`);
@@ -37,7 +37,7 @@ class MakeTexcoord {
NodeShader.write_attrib(frag, 'uvsp.x *= aspectRatio;');
NodeShader.write_attrib(frag, 'uvsp *= 0.21 / (decalMask.w * 0.9);'); // Decal radius
NodeShader.write_attrib(frag, 'if (brushDirection.z == 0.0) discard;');
NodeShader.write_attrib(frag, 'uvsp = vec2(uvsp.x * brushDirection.x - uvsp.y * brushDirection.y, uvsp.x * brushDirection.y + uvsp.y * brushDirection.x);');
- let canvas: zui_node_canvas_t = Context.raw.brush.canvas;
- let nodes: zui_nodes_t = Context.raw.brush.nodes;
+ let canvas: zui_node_canvas_t = context_raw.brush.canvas;
+ let nodes: zui_nodes_t = context_raw.brush.nodes;
let node: zui_node_t = UINodes.make_node(n, nodes, canvas);
@@ -27,16 +27,16 @@ class RenderPathPaint {
let t: render_target_t = render_target_create();
- t.width = Config.get_texture_res_x();
- t.height = Config.get_texture_res_y();
+ t.width = config_get_texture_res_x();
+ t.height = config_get_texture_res_y();
@@ -105,19 +105,19 @@ class RenderPathPaint {
static commands_paint = (dilation = true) => {
- let tid: i32 = Context.raw.layer.id;
+ let tid: i32 = context_raw.layer.id;
- let particle_physics: bool = Context.raw.particle_physics;
+ let particle_physics: bool = context_raw.particle_physics;
let particle_physics: bool = false;
- if (Context.raw.tool == workspace_tool_t.PARTICLE && !particle_physics) {
+ if (context_raw.tool == workspace_tool_t.PARTICLE && !particle_physics) {
render_path_set_target("texparticle");
render_path_bind_target("_main", "gbufferD");
- if ((Context.raw.xray || Config.raw.brush_angle_reject) && Config.raw.brush_3d) {
+ if ((context_raw.xray || config_raw.brush_angle_reject) && config_raw.brush_3d) {
render_path_bind_target("gbuffer0", "gbuffer0");
@@ -134,16 +134,16 @@ class RenderPathPaint {
///if is_paint
render_path_set_target("texpaint_colorid");
render_path_clear_target(0xff000000);
render_path_draw_meshes("paint");
UIHeader.header_handle.redraws = 2;
- if (Context.raw.paint2d) {
+ if (context_raw.paint2d) {
render_path_set_target("gbuffer0", ["gbuffer1", "gbuffer2"]);
render_path_draw_meshes("mesh");
@@ -155,20 +155,20 @@ class RenderPathPaint {
let texpaint_posnortex_picker1: image_t = render_path_render_targets.get("texpaint_posnortex_picker1")._image;
let a: DataView = new DataView(image_get_pixels(texpaint_posnortex_picker0));
let b: DataView = new DataView(image_get_pixels(texpaint_posnortex_picker1));
- Context.raw.posx_picked = a.getFloat32(0, true);
- Context.raw.posy_picked = a.getFloat32(4, true);
- Context.raw.posz_picked = a.getFloat32(8, true);
- Context.raw.uvx_picked = a.getFloat32(12, true);
- Context.raw.norx_picked = b.getFloat32(0, true);
- Context.raw.nory_picked = b.getFloat32(4, true);
- Context.raw.norz_picked = b.getFloat32(8, true);
- Context.raw.uvy_picked = b.getFloat32(12, true);
+ context_raw.posx_picked = a.getFloat32(0, true);
+ context_raw.posy_picked = a.getFloat32(4, true);
+ context_raw.posz_picked = a.getFloat32(8, true);
+ context_raw.uvx_picked = a.getFloat32(12, true);
+ context_raw.norx_picked = b.getFloat32(0, true);
+ context_raw.nory_picked = b.getFloat32(4, true);
+ context_raw.norz_picked = b.getFloat32(8, true);
+ context_raw.uvy_picked = b.getFloat32(12, true);
render_path_set_target("texpaint_picker", ["texpaint_nor_picker", "texpaint_pack_picker", "texpaint_uv_picker"]);
- tid = Context.raw.layer.id;
- let use_live_layer: bool = Context.raw.tool == workspace_tool_t.MATERIAL;
+ tid = context_raw.layer.id;
+ let use_live_layer: bool = context_raw.tool == workspace_tool_t.MATERIAL;
if (use_live_layer) RenderPathPaint.use_live_layer(true);
@@ -187,8 +187,8 @@ class RenderPathPaint {
let c: DataView = new DataView(image_get_pixels(texpaint_pack_picker));
let d: DataView = new DataView(image_get_pixels(texpaint_uv_picker));
- if (Context.raw.color_picker_callback != null) {
- Context.raw.color_picker_callback(Context.raw.picked_color);
+ if (context_raw.color_picker_callback != null) {
+ context_raw.color_picker_callback(context_raw.picked_color);
@@ -202,27 +202,27 @@ class RenderPathPaint {
let i2: i32 = 2;
let i3: i32 = 3;
- Context.raw.picked_color.base = color_set_rb(Context.raw.picked_color.base, a.getUint8(i0));
- Context.raw.picked_color.base = color_set_gb(Context.raw.picked_color.base, a.getUint8(i1));
- Context.raw.picked_color.base = color_set_bb(Context.raw.picked_color.base, a.getUint8(i2));
- Context.raw.picked_color.normal = color_set_rb(Context.raw.picked_color.normal, b.getUint8(i0));
- Context.raw.picked_color.normal = color_set_gb(Context.raw.picked_color.normal, b.getUint8(i1));
- Context.raw.picked_color.normal = color_set_bb(Context.raw.picked_color.normal, b.getUint8(i2));
- Context.raw.picked_color.occlusion = c.getUint8(i0) / 255;
- Context.raw.picked_color.roughness = c.getUint8(i1) / 255;
- Context.raw.picked_color.metallic = c.getUint8(i2) / 255;
- Context.raw.picked_color.height = c.getUint8(i3) / 255;
- Context.raw.picked_color.opacity = a.getUint8(i3) / 255;
- Context.raw.uvx_picked = d.getUint8(i0) / 255;
- Context.raw.uvy_picked = d.getUint8(i1) / 255;
+ context_raw.picked_color.base = color_set_rb(context_raw.picked_color.base, a.getUint8(i0));
+ context_raw.picked_color.base = color_set_gb(context_raw.picked_color.base, a.getUint8(i1));
+ context_raw.picked_color.base = color_set_bb(context_raw.picked_color.base, a.getUint8(i2));
+ context_raw.picked_color.normal = color_set_rb(context_raw.picked_color.normal, b.getUint8(i0));
+ context_raw.picked_color.normal = color_set_gb(context_raw.picked_color.normal, b.getUint8(i1));
+ context_raw.picked_color.normal = color_set_bb(context_raw.picked_color.normal, b.getUint8(i2));
+ context_raw.picked_color.occlusion = c.getUint8(i0) / 255;
+ context_raw.picked_color.roughness = c.getUint8(i1) / 255;
+ context_raw.picked_color.metallic = c.getUint8(i2) / 255;
+ context_raw.picked_color.height = c.getUint8(i3) / 255;
+ context_raw.picked_color.opacity = a.getUint8(i3) / 255;
+ context_raw.uvx_picked = d.getUint8(i0) / 255;
+ context_raw.uvy_picked = d.getUint8(i1) / 255;
// Pick material
- if (Context.raw.picker_select_material && Context.raw.color_picker_callback == null) {
+ if (context_raw.picker_select_material && context_raw.color_picker_callback == null) {
let matid: i32 = Math.floor((b.getUint8(3) - (b.getUint8(3) % 3)) / 3);
- for (let m of Project.materials) {
+ for (let m of project_materials) {
if (m.id == matid) {
- Context.set_material(m);
- Context.raw.materialid_picked = matid;
+ context_set_material(m);
+ context_raw.materialid_picked = matid;
@@ -231,13 +231,13 @@ class RenderPathPaint {
- if (Context.raw.tool == workspace_tool_t.BAKE && Context.raw.bake_type == bake_type_t.AO) {
+ if (context_raw.tool == workspace_tool_t.BAKE && context_raw.bake_type == bake_type_t.AO) {
if (RenderPathPaint.init_voxels) {
RenderPathPaint.init_voxels = false;
- let _rp_gi: bool = Config.raw.rp_gi;
- Config.raw.rp_gi = true;
+ let _rp_gi: bool = config_raw.rp_gi;
+ config_raw.rp_gi = true;
RenderPathBase.init_voxels();
- Config.raw.rp_gi = _rp_gi;
+ config_raw.rp_gi = _rp_gi;
render_path_clear_image("voxels", 0x00000000);
@@ -249,7 +249,7 @@ class RenderPathPaint {
let texpaint: string = "texpaint" + tid;
- if (Context.raw.tool == workspace_tool_t.BAKE && Context.raw.brush_time == time_delta()) {
+ if (context_raw.tool == workspace_tool_t.BAKE && context_raw.brush_time == time_delta()) {
// Clear to black on bake start
render_path_set_target(texpaint);
@@ -258,11 +258,11 @@ class RenderPathPaint {
render_path_set_target("texpaint_blend1");
render_path_bind_target("texpaint_blend0", "tex");
render_path_draw_shader("shader_datas/copy_pass/copyR8_pass");
- let ptid: i32 = Context.raw.layer.parent.id;
- if (SlotLayer.is_group(Context.raw.layer.parent)) { // Group mask
- for (let c of SlotLayer.get_children(Context.raw.layer.parent)) {
+ let ptid: i32 = context_raw.layer.parent.id;
+ if (SlotLayer.is_group(context_raw.layer.parent)) { // Group mask
+ for (let c of SlotLayer.get_children(context_raw.layer.parent)) {
ptid = c.id;
@@ -273,40 +273,40 @@ class RenderPathPaint {
render_path_set_target(texpaint, ["texpaint_nor" + tid, "texpaint_pack" + tid, "texpaint_blend0"]);
render_path_bind_target("voxels", "voxels");
render_path_bind_target("texpaint_colorid", "texpaint_colorid");
- let read_tc: bool = (Context.raw.tool == workspace_tool_t.FILL && Context.raw.fill_type_handle.position == fill_type_t.FACE) ||
- Context.raw.tool == workspace_tool_t.SMUDGE;
+ let read_tc: bool = (context_raw.tool == workspace_tool_t.FILL && context_raw.fill_type_handle.position == fill_type_t.FACE) ||
+ context_raw.tool == workspace_tool_t.SMUDGE;
if (read_tc) {
- if (Context.raw.tool == workspace_tool_t.BAKE && Context.raw.bake_type == bake_type_t.CURVATURE && Context.raw.bake_curv_smooth > 0) {
+ if (context_raw.tool == workspace_tool_t.BAKE && context_raw.bake_type == bake_type_t.CURVATURE && context_raw.bake_curv_smooth > 0) {
if (render_path_render_targets.get("texpaint_blur") == null) {
t.name = "texpaint_blur";
- t.width = Math.floor(Config.get_texture_res_x() * 0.95);
- t.height = Math.floor(Config.get_texture_res_y() * 0.95);
+ t.width = Math.floor(config_get_texture_res_x() * 0.95);
+ t.height = Math.floor(config_get_texture_res_y() * 0.95);
- let blurs: i32 = Math.round(Context.raw.bake_curv_smooth);
+ let blurs: i32 = Math.round(context_raw.bake_curv_smooth);
for (let i: i32 = 0; i < blurs; ++i) {
render_path_set_target("texpaint_blur");
render_path_bind_target(texpaint, "tex");
@@ -317,7 +317,7 @@ class RenderPathPaint {
- if (dilation && Config.raw.dilate == dilate_type_t.INSTANT) {
+ if (dilation && config_raw.dilate == dilate_type_t.INSTANT) {
@@ -330,16 +330,16 @@ class RenderPathPaint {
render_path_set_target(texpaint, ["texpaint_blend0"]);
render_path_bind_target("gbufferD_undo", "gbufferD");
@@ -347,14 +347,14 @@ class RenderPathPaint {
let material_contexts: material_context_t[] = [];
let shader_contexts: shader_context_t[] = [];
- let mats: material_data_t[] = Project.paint_objects[0].materials;
- mesh_object_get_contexts(Project.paint_objects[0], "paint", mats, material_contexts, shader_contexts);
+ let mats: material_data_t[] = project_paint_objects[0].materials;
+ mesh_object_get_contexts(project_paint_objects[0], "paint", mats, material_contexts, shader_contexts);
let cc_context: shader_context_t = shader_contexts[0];
if (const_data_screen_aligned_vb == null) const_data_create_screen_aligned_data();
g4_set_pipeline(cc_context._.pipe_state);
uniforms_set_context_consts(cc_context,_render_path_bind_params);
- uniforms_set_obj_consts(cc_context, Project.paint_objects[0].base);
+ uniforms_set_obj_consts(cc_context, project_paint_objects[0].base);
uniforms_set_material_consts(cc_context, material_contexts[0]);
g4_set_vertex_buffer(const_data_screen_aligned_vb);
g4_set_index_buffer(const_data_screen_aligned_ib);
@@ -365,8 +365,8 @@ class RenderPathPaint {
static use_live_layer = (use: bool) => {
- let hid: i32 = History.undo_i - 1 < 0 ? Config.raw.undo_steps - 1 : History.undo_i - 1;
+ let hid: i32 = history_undo_i - 1 < 0 ? config_raw.undo_steps - 1 : history_undo_i - 1;
if (use) {
RenderPathPaint._texpaint = render_path_render_targets.get("texpaint" + tid);
RenderPathPaint._texpaint_undo = render_path_render_targets.get("texpaint_undo" + hid);
@@ -376,7 +376,7 @@ class RenderPathPaint {
RenderPathPaint._texpaint_pack = render_path_render_targets.get("texpaint_pack" + tid);
render_path_render_targets.set("texpaint_undo" + hid,render_path_render_targets.get("texpaint" + tid));
render_path_render_targets.set("texpaint" + tid,render_path_render_targets.get("texpaint_live"));
- if (SlotLayer.is_layer(Context.raw.layer)) {
+ if (SlotLayer.is_layer(context_raw.layer)) {
render_path_render_targets.set("texpaint_nor_undo" + hid,render_path_render_targets.get("texpaint_nor" + tid));
render_path_render_targets.set("texpaint_pack_undo" + hid,render_path_render_targets.get("texpaint_pack" + tid));
render_path_render_targets.set("texpaint_nor" + tid,render_path_render_targets.get("texpaint_nor_live"));
@@ -386,7 +386,7 @@ class RenderPathPaint {
render_path_render_targets.set("texpaint" + tid, RenderPathPaint._texpaint);
render_path_render_targets.set("texpaint_undo" + hid, RenderPathPaint._texpaint_undo);
render_path_render_targets.set("texpaint_nor_undo" + hid, RenderPathPaint._texpaint_nor_undo);
render_path_render_targets.set("texpaint_pack_undo" + hid, RenderPathPaint._texpaint_pack_undo);
render_path_render_targets.set("texpaint_nor" + tid, RenderPathPaint._texpaint_nor);
@@ -397,7 +397,7 @@ class RenderPathPaint {
static commands_live_brush = () => {
- let tool: workspace_tool_t = Context.raw.tool;
+ let tool: workspace_tool_t = context_raw.tool;
if (tool != workspace_tool_t.BRUSH &&
tool != workspace_tool_t.ERASER &&
tool != workspace_tool_t.CLONE &&
@@ -414,8 +414,8 @@ class RenderPathPaint {
RenderPathPaint.live_layer = SlotLayer.create("_live");
render_path_set_target("texpaint_live");
render_path_bind_target("texpaint" + tid, "tex");
render_path_draw_shader("shader_datas/copy_pass/copy_pass");
@@ -433,41 +433,41 @@ class RenderPathPaint {
RenderPathPaint.live_layer_drawn = 2;
UIView2D.hwnd.redraws = 2;
- let _x: f32 = Context.raw.paint_vec.x;
- let _y: f32 = Context.raw.paint_vec.y;
- if (Context.raw.brush_locked) {
- Context.raw.paint_vec.x = (Context.raw.lock_started_x - app_x()) / app_w();
- Context.raw.paint_vec.y = (Context.raw.lock_started_y - app_y()) / app_h();
- }
- let _last_x: f32 = Context.raw.last_paint_vec_x;
- let _last_y: f32 = Context.raw.last_paint_vec_y;
- let _pdirty: i32 = Context.raw.pdirty;
- Context.raw.last_paint_vec_x = Context.raw.paint_vec.x;
- Context.raw.last_paint_vec_y = Context.raw.paint_vec.y;
- if (Operator.shortcut(Config.keymap.brush_ruler)) {
- Context.raw.last_paint_vec_x = Context.raw.last_paint_x;
- Context.raw.last_paint_vec_y = Context.raw.last_paint_y;
- Context.raw.pdirty = 2;
+ let _x: f32 = context_raw.paint_vec.x;
+ let _y: f32 = context_raw.paint_vec.y;
+ if (context_raw.brush_locked) {
+ context_raw.paint_vec.x = (context_raw.lock_started_x - app_x()) / app_w();
+ context_raw.paint_vec.y = (context_raw.lock_started_y - app_y()) / app_h();
+ }
+ let _last_x: f32 = context_raw.last_paint_vec_x;
+ let _last_y: f32 = context_raw.last_paint_vec_y;
+ let _pdirty: i32 = context_raw.pdirty;
+ context_raw.last_paint_vec_x = context_raw.paint_vec.x;
+ context_raw.last_paint_vec_y = context_raw.paint_vec.y;
+ if (operator_shortcut(config_keymap.brush_ruler)) {
+ context_raw.last_paint_vec_x = context_raw.last_paint_x;
+ context_raw.last_paint_vec_y = context_raw.last_paint_y;
+ context_raw.pdirty = 2;
RenderPathPaint.commands_symmetry();
RenderPathPaint.commands_paint();
- Context.raw.paint_vec.x = _x;
- Context.raw.paint_vec.y = _y;
- Context.raw.last_paint_vec_x = _last_x;
- Context.raw.last_paint_vec_y = _last_y;
- Context.raw.pdirty = _pdirty;
- Context.raw.brush_blend_dirty = true;
+ context_raw.paint_vec.x = _x;
+ context_raw.paint_vec.y = _y;
+ context_raw.last_paint_vec_x = _last_x;
+ context_raw.last_paint_vec_y = _last_y;
+ context_raw.pdirty = _pdirty;
+ context_raw.brush_blend_dirty = true;
static commands_cursor = () => {
- if (!Config.raw.brush_3d) return;
- let decal_mask: bool = decal && Operator.shortcut(Config.keymap.decal_mask, ShortcutType.ShortcutDown);
+ if (!config_raw.brush_3d) return;
+ let decal_mask: bool = decal && operator_shortcut(config_keymap.decal_mask, shortcut_type_t.DOWN);
@@ -478,20 +478,20 @@ class RenderPathPaint {
- let group_layer: bool = SlotLayer.is_group(Context.raw.layer);
+ let group_layer: bool = SlotLayer.is_group(context_raw.layer);
if (!base_ui_enabled || base_is_dragging || fill_layer || group_layer) {
- let mx: f32 = Context.raw.paint_vec.x;
- let my: f32 = 1.0 - Context.raw.paint_vec.y;
- mx = (Context.raw.lock_started_x - app_x()) / app_w();
- my = 1.0 - (Context.raw.lock_started_y - app_y()) / app_h();
+ let mx: f32 = context_raw.paint_vec.x;
+ let my: f32 = 1.0 - context_raw.paint_vec.y;
+ mx = (context_raw.lock_started_x - app_x()) / app_w();
+ my = 1.0 - (context_raw.lock_started_y - app_y()) / app_h();
- let radius: f32 = decal_mask ? Context.raw.brush_decal_mask_radius : Context.raw.brush_radius;
- RenderPathPaint.draw_cursor(mx, my, Context.raw.brush_nodes_radius * radius / 3.4);
+ let radius: f32 = decal_mask ? context_raw.brush_decal_mask_radius : context_raw.brush_radius;
+ RenderPathPaint.draw_cursor(mx, my, context_raw.brush_nodes_radius * radius / 3.4);
static draw_cursor = (mx: f32, my: f32, radius: f32, tintR = 1.0, tintG = 1.0, tintB = 1.0) => {
@@ -502,9 +502,9 @@ class RenderPathPaint {
g4_set_pipeline(base_pipe_cursor);
- let img: image_t = (decal && !decal_mask) ? Context.raw.decal_image : Res.get("cursor.k");
+ let img: image_t = (decal && !decal_mask) ? context_raw.decal_image : resource_get("cursor.k");
g4_set_tex(base_cursor_tex, img);
let gbuffer0: image_t = render_path_render_targets.get("gbuffer0")._image;
g4_set_tex_depth(base_cursor_gbufferd, gbuffer0);
@@ -531,43 +531,43 @@ class RenderPathPaint {
static commands_symmetry = () => {
- if (Context.raw.sym_x || Context.raw.sym_y || Context.raw.sym_z) {
- let t: transform_t = Context.raw.paint_object.base.transform;
+ if (context_raw.sym_x || context_raw.sym_y || context_raw.sym_z) {
+ let t: transform_t = context_raw.paint_object.base.transform;
let sx: f32 = t.scale.x;
let sy: f32 = t.scale.y;
let sz: f32 = t.scale.z;
- if (Context.raw.sym_x) {
+ if (context_raw.sym_x) {
vec4_set(t.scale, -sx, sy, sz);
transform_build_matrix(t);
- if (Context.raw.sym_y) {
+ if (context_raw.sym_y) {
vec4_set(t.scale, sx, -sy, sz);
- if (Context.raw.sym_z) {
+ if (context_raw.sym_z) {
vec4_set(t.scale, sx, sy, -sz);
- if (Context.raw.sym_x && Context.raw.sym_y) {
+ if (context_raw.sym_x && context_raw.sym_y) {
vec4_set(t.scale, -sx, -sy, sz);
- if (Context.raw.sym_x && Context.raw.sym_z) {
+ if (context_raw.sym_x && context_raw.sym_z) {
vec4_set(t.scale, -sx, sy, -sz);
- if (Context.raw.sym_y && Context.raw.sym_z) {
+ if (context_raw.sym_y && context_raw.sym_z) {
vec4_set(t.scale, sx, -sy, -sz);
- if (Context.raw.sym_x && Context.raw.sym_y && Context.raw.sym_z) {
+ if (context_raw.sym_x && context_raw.sym_y && context_raw.sym_z) {
vec4_set(t.scale, -sx, -sy, -sz);
@@ -579,15 +579,15 @@ class RenderPathPaint {
static paint_enabled = (): bool => {
- let fill_layer: bool = Context.raw.layer.fill_layer != null && Context.raw.tool != workspace_tool_t.PICKER && Context.raw.tool != workspace_tool_t.MATERIAL && Context.raw.tool != workspace_tool_t.COLORID;
+ let fill_layer: bool = context_raw.layer.fill_layer != null && context_raw.tool != workspace_tool_t.PICKER && context_raw.tool != workspace_tool_t.MATERIAL && context_raw.tool != workspace_tool_t.COLORID;
///if is_sculpt
- let fill_layer: bool = Context.raw.layer.fill_layer != null && Context.raw.tool != workspace_tool_t.PICKER && Context.raw.tool != workspace_tool_t.MATERIAL;
+ let fill_layer: bool = context_raw.layer.fill_layer != null && context_raw.tool != workspace_tool_t.PICKER && context_raw.tool != workspace_tool_t.MATERIAL;
- return !fill_layer && !group_layer && !Context.raw.foreground_event;
+ return !fill_layer && !group_layer && !context_raw.foreground_event;
static live_brush_dirty = () => {
@@ -595,10 +595,10 @@ class RenderPathPaint {
let my: f32 = RenderPathPaint.last_y;
RenderPathPaint.last_x = mouse_view_x();
RenderPathPaint.last_y = mouse_view_y();
- if (Config.raw.brush_live && Context.raw.pdirty <= 0) {
- let moved: bool = (mx != RenderPathPaint.last_x || my != RenderPathPaint.last_y) && (Context.in_viewport() || Context.in_2d_view());
- if (moved || Context.raw.brush_locked) {
- Context.raw.rdirty = 2;
+ if (config_raw.brush_live && context_raw.pdirty <= 0) {
+ let moved: bool = (mx != RenderPathPaint.last_x || my != RenderPathPaint.last_y) && (context_in_viewport() || context_in_2d_view());
+ if (moved || context_raw.brush_locked) {
+ context_raw.rdirty = 2;
@@ -607,7 +607,7 @@ class RenderPathPaint {
if (!RenderPathPaint.dilated) {
- RenderPathPaint.dilate(Config.raw.dilate == dilate_type_t.DELAYED, true);
+ RenderPathPaint.dilate(config_raw.dilate == dilate_type_t.DELAYED, true);
RenderPathPaint.dilated = true;
@@ -615,11 +615,11 @@ class RenderPathPaint {
if (!RenderPathPaint.paint_enabled()) return;
- RenderPathPaint.push_undo_last = History.push_undo;
+ RenderPathPaint.push_undo_last = history_push_undo;
- if (History.push_undo && History.undo_layers != null) {
- History.paint();
+ if (history_push_undo && history_undo_layers != null) {
+ history_paint();
render_path_set_target("gbuffer0_undo");
@@ -633,18 +633,18 @@ class RenderPathPaint {
- if (History.push_undo2 && History.undo_layers != null) {
+ if (history_push_undo2 && history_undo_layers != null) {
RenderPathPaint.set_plane_mesh();
if (RenderPathPaint.live_layer_drawn > 0) RenderPathPaint.live_layer_drawn--;
- if (Config.raw.brush_live && Context.raw.pdirty <= 0 && Context.raw.ddirty <= 0 && Context.raw.brush_time == 0) {
+ if (config_raw.brush_live && context_raw.pdirty <= 0 && context_raw.ddirty <= 0 && context_raw.brush_time == 0) {
// Depth is unchanged, draw before gbuffer gets updated
RenderPathPaint.commands_live_brush();
@@ -652,97 +652,97 @@ class RenderPathPaint {
RenderPathPaint.commands_cursor();
///if (!krom_ios) // No hover on iPad, decals are painted by pen release
- if (Config.raw.brush_live && Context.raw.pdirty <= 0 && Context.raw.ddirty > 0 && Context.raw.brush_time == 0) {
+ if (config_raw.brush_live && context_raw.pdirty <= 0 && context_raw.ddirty > 0 && context_raw.brush_time == 0) {
// gbuffer has been updated now but brush will lag 1 frame
- if (History.undo_layers != null) {
+ if (history_undo_layers != null) {
- if (Context.raw.pdirty > 0) RenderPathPaint.dilated = false;
+ if (context_raw.pdirty > 0) RenderPathPaint.dilated = false;
- let is_raytraced_bake: bool = (Context.raw.bake_type == bake_type_t.AO ||
- Context.raw.bake_type == bake_type_t.LIGHTMAP ||
- Context.raw.bake_type == bake_type_t.BENT_NORMAL ||
- Context.raw.bake_type == bake_type_t.THICKNESS);
+ let is_raytraced_bake: bool = (context_raw.bake_type == bake_type_t.AO ||
+ context_raw.bake_type == bake_type_t.LIGHTMAP ||
+ context_raw.bake_type == bake_type_t.BENT_NORMAL ||
+ context_raw.bake_type == bake_type_t.THICKNESS);
- if (Context.raw.bake_type == bake_type_t.NORMAL || Context.raw.bake_type == bake_type_t.HEIGHT || Context.raw.bake_type == bake_type_t.DERIVATIVE) {
- if (!RenderPathPaint.baking && Context.raw.pdirty > 0) {
+ if (context_raw.bake_type == bake_type_t.NORMAL || context_raw.bake_type == bake_type_t.HEIGHT || context_raw.bake_type == bake_type_t.DERIVATIVE) {
+ if (!RenderPathPaint.baking && context_raw.pdirty > 0) {
RenderPathPaint.baking = true;
- Context.raw.bake_type = Context.raw.bake_type == bake_type_t.NORMAL ? bake_type_t.NORMAL_OBJECT : bake_type_t.POSITION; // Bake high poly data
+ context_raw.bake_type = context_raw.bake_type == bake_type_t.NORMAL ? bake_type_t.NORMAL_OBJECT : bake_type_t.POSITION; // Bake high poly data
- let _paint_object: mesh_object_t = Context.raw.paint_object;
- let high_poly: mesh_object_t = Project.paint_objects[Context.raw.bake_high_poly];
+ let _paint_object: mesh_object_t = context_raw.paint_object;
+ let high_poly: mesh_object_t = project_paint_objects[context_raw.bake_high_poly];
let _visible: bool = high_poly.base.visible;
high_poly.base.visible = true;
- Context.select_paint_object(high_poly);
+ context_select_paint_object(high_poly);
high_poly.base.visible = _visible;
- if (RenderPathPaint.push_undo_last) History.paint();
- Context.select_paint_object(_paint_object);
+ if (RenderPathPaint.push_undo_last) history_paint();
+ context_select_paint_object(_paint_object);
let _render_final = () => {
RenderPathPaint.baking = false;
let _render_deriv = () => {
- Context.raw.bake_type = bake_type_t.HEIGHT;
+ context_raw.bake_type = bake_type_t.HEIGHT;
app_notify_on_init(_render_final);
- let bake_type: bake_type_t = Context.raw.bake_type as bake_type_t;
+ let bake_type: bake_type_t = context_raw.bake_type as bake_type_t;
app_notify_on_init(bake_type == bake_type_t.DERIVATIVE ? _render_deriv : _render_final);
- let _layer_filter: i32 = Context.raw.layer_filter;
- let is_merged: bool = Context.raw.merged_object != null;
- let _visible: bool = is_merged && Context.raw.merged_object.base.visible;
- Context.raw.layer_filter = 1;
- if (is_merged) Context.raw.merged_object.base.visible = false;
-
- for (let p of Project.paint_objects) {
- Context.select_paint_object(p);
+ let _layer_filter: i32 = context_raw.layer_filter;
+ let is_merged: bool = context_raw.merged_object != null;
+ let _visible: bool = is_merged && context_raw.merged_object.base.visible;
+ context_raw.layer_filter = 1;
+ if (is_merged) context_raw.merged_object.base.visible = false;
+
+ for (let p of project_paint_objects) {
+ context_select_paint_object(p);
- Context.raw.layer_filter = _layer_filter;
- if (is_merged) Context.raw.merged_object.base.visible = _visible;
+ context_raw.layer_filter = _layer_filter;
+ if (is_merged) context_raw.merged_object.base.visible = _visible;
else if (is_raytraced_bake) {
let dirty: bool = RenderPathRaytraceBake.commands(MakeMaterial.parse_paint_material);
if (dirty) UIHeader.header_handle.redraws = 2;
- if (Config.raw.dilate == dilate_type_t.INSTANT) { // && Context.raw.pdirty == 1
+ if (config_raw.dilate == dilate_type_t.INSTANT) { // && raw.pdirty == 1
@@ -761,8 +761,8 @@ class RenderPathPaint {
- if (Context.raw.brush_blend_dirty) {
- Context.raw.brush_blend_dirty = false;
+ if (context_raw.brush_blend_dirty) {
+ context_raw.brush_blend_dirty = false;
@@ -774,28 +774,28 @@ class RenderPathPaint {
RenderPathPaint.restore_plane_mesh();
static set_plane_mesh = () => {
- Context.raw.paint2d_view = true;
- RenderPathPaint.painto = Context.raw.paint_object;
+ context_raw.paint2d_view = true;
+ RenderPathPaint.painto = context_raw.paint_object;
RenderPathPaint.visibles = [];
RenderPathPaint.visibles.push(p.base.visible);
p.base.visible = false;
- if (Context.raw.merged_object != null) {
- RenderPathPaint.merged_object_visible = Context.raw.merged_object.base.visible;
- Context.raw.merged_object.base.visible = false;
+ if (context_raw.merged_object != null) {
+ RenderPathPaint.merged_object_visible = context_raw.merged_object.base.visible;
+ context_raw.merged_object.base.visible = false;
let cam: camera_object_t = scene_camera;
- mat4_set_from(Context.raw.saved_camera, cam.base.transform.local);
+ mat4_set_from(context_raw.saved_camera, cam.base.transform.local);
RenderPathPaint.saved_fov = cam.data.fov;
- Viewport.update_camera_type(camera_type_t.PERSPECTIVE);
+ viewport_update_camera_type(camera_type_t.PERSPECTIVE);
let m: mat4_t = mat4_identity();
mat4_translate(m, 0, 0, 0.5);
transform_set_matrix(cam.base.transform, m);
@@ -841,31 +841,31 @@ class RenderPathPaint {
RenderPathPaint.planeo = scene_get_child(tiled ? ".PlaneTiled" : ".Plane").ext;
RenderPathPaint.planeo.base.visible = true;
- Context.raw.paint_object = RenderPathPaint.planeo;
+ context_raw.paint_object = RenderPathPaint.planeo;
let v: vec4_t = vec4_create();
let sx: f32 = vec4_len(vec4_set(v, m.m[0], m.m[1], m.m[2]));
quat_from_euler(RenderPathPaint.planeo.base.transform.rot, -Math.PI / 2, 0, 0);
vec4_set(RenderPathPaint.planeo.base.transform.scale, sx, 1.0, sx);
- RenderPathPaint.planeo.base.transform.scale.z *= Config.get_texture_res_y() / Config.get_texture_res_x();
+ RenderPathPaint.planeo.base.transform.scale.z *= config_get_texture_res_y() / config_get_texture_res_x();
vec4_set(RenderPathPaint.planeo.base.transform.loc, m.m[12], -m.m[13], 0.0);
transform_build_matrix(RenderPathPaint.planeo.base.transform);
static restore_plane_mesh = () => {
- Context.raw.paint2d_view = false;
+ context_raw.paint2d_view = false;
RenderPathPaint.planeo.base.visible = false;
vec4_set(RenderPathPaint.planeo.base.transform.loc, 0.0, 0.0, 0.0);
- for (let i: i32 = 0; i < Project.paint_objects.length; ++i) {
- Project.paint_objects[i].base.visible = RenderPathPaint.visibles[i];
+ for (let i: i32 = 0; i < project_paint_objects.length; ++i) {
+ project_paint_objects[i].base.visible = RenderPathPaint.visibles[i];
- Context.raw.merged_object.base.visible = RenderPathPaint.merged_object_visible;
+ context_raw.merged_object.base.visible = RenderPathPaint.merged_object_visible;
- Context.raw.paint_object = RenderPathPaint.painto;
- transform_set_matrix(scene_camera.base.transform, Context.raw.saved_camera);
+ context_raw.paint_object = RenderPathPaint.painto;
+ transform_set_matrix(scene_camera.base.transform, context_raw.saved_camera);
scene_camera.data.fov = RenderPathPaint.saved_fov;
- Viewport.update_camera_type(Context.raw.camera_type);
+ viewport_update_camera_type(context_raw.camera_type);
camera_object_build_proj(scene_camera);
camera_object_build_mat(scene_camera);
@@ -874,13 +874,13 @@ class RenderPathPaint {
static bind_layers = () => {
- let is_live: bool = Config.raw.brush_live && RenderPathPaint.live_layer_drawn > 0;
+ let is_live: bool = config_raw.brush_live && RenderPathPaint.live_layer_drawn > 0;
if (is_live || is_material_tool) RenderPathPaint.use_live_layer(true);
- for (let i: i32 = 0; i < Project.layers.length; ++i) {
- let l: SlotLayerRaw = Project.layers[i];
+ for (let i: i32 = 0; i < project_layers.length; ++i) {
+ let l: SlotLayerRaw = project_layers[i];
render_path_bind_target("texpaint" + l.id, "texpaint" + l.id);
@@ -894,18 +894,18 @@ class RenderPathPaint {
static unbind_layers = () => {
if (is_live || is_material_tool) RenderPathPaint.use_live_layer(false);
static dilate = (base: bool, nor_pack: bool) => {
- if (Config.raw.dilate_radius > 0 && !Context.raw.paint2d) {
+ if (config_raw.dilate_radius > 0 && !context_raw.paint2d) {
UtilUV.cache_dilate_map();
base_make_temp_img();
if (base) {
let texpaint: string = "texpaint";
render_path_set_target("temptex0");
@@ -915,7 +915,7 @@ class RenderPathPaint {
render_path_bind_target("temptex0", "tex");
render_path_draw_shader("shader_datas/dilate_pass/dilate_pass");
- if (nor_pack && !SlotLayer.is_mask(Context.raw.layer)) {
+ if (nor_pack && !SlotLayer.is_mask(context_raw.layer)) {
render_path_bind_target("texpaint_nor" + tid, "tex");
@@ -98,7 +98,7 @@ class RenderPathPreview {
let framebuffer: string = "texpreview";
- let selected_mat: SlotMaterialRaw = Context.raw.material;
+ let selected_mat: SlotMaterialRaw = context_raw.material;
render_path_render_targets.get("texpreview")._image = selected_mat.image;
render_path_render_targets.get("texpreview_icon")._image = selected_mat.image_icon;
@@ -142,7 +142,7 @@ class RenderPathPreview {
- render_path_render_targets.get("texpreview")._image = Context.raw.decal_image;
+ render_path_render_targets.get("texpreview")._image = context_raw.decal_image;
render_path_set_target(framebuffer);
@@ -13,7 +13,7 @@ class SlotBrush {
static create(c: zui_node_canvas_t = null): SlotBrushRaw {
let raw: SlotBrushRaw = new SlotBrushRaw();
- for (let brush of Project.brushes) if (brush.id >= raw.id) raw.id = brush.id + 1;
+ for (let brush of project_brushes) if (brush.id >= raw.id) raw.id = brush.id + 1;
if (c == null) {
if (SlotBrush.default_canvas == null) { // Synchronous
@@ -12,7 +12,7 @@ class SlotFont {
static create(name: string, font: g2_font_t, file = ""): SlotFontRaw {
let raw: SlotFontRaw = new SlotFontRaw();
- for (let slot of Project.fonts) if (slot.id >= raw.id) raw.id = slot.id + 1;
+ for (let slot of project_fonts) if (slot.id >= raw.id) raw.id = slot.id + 1;
raw.name = name;
raw.font = font;
raw.file = file;
@@ -41,7 +41,7 @@ class SlotLayer {
let raw: SlotLayerRaw = new SlotLayerRaw();
if (ext == "") {
raw.id = 0;
- for (let l of Project.layers) if (l.id >= raw.id) raw.id = l.id + 1;
+ for (let l of project_layers) if (l.id >= raw.id) raw.id = l.id + 1;
ext = raw.id + "";
raw.ext = ext;
@@ -65,8 +65,8 @@ class SlotLayer {
t.name = "texpaint" + ext;
t.format = format;
raw.texpaint = render_path_create_render_target(t)._image;
@@ -75,16 +75,16 @@ class SlotLayer {
t.name = "texpaint_nor" + ext;
raw.texpaint_nor = render_path_create_render_target(t)._image;
t.name = "texpaint_pack" + ext;
raw.texpaint_pack = render_path_create_render_target(t)._image;
@@ -102,8 +102,8 @@ class SlotLayer {
@@ -129,11 +129,11 @@ class SlotLayer {
if (masks != null) for (let m of masks) SlotLayer.delete(m);
- let lpos: i32 = Project.layers.indexOf(raw);
- array_remove(Project.layers, raw);
+ let lpos: i32 = project_layers.indexOf(raw);
+ array_remove(project_layers, raw);
// Undo can remove base layer and then restore it from undo layers
- if (Project.layers.length > 0) {
- Context.set_layer(Project.layers[lpos > 0 ? lpos - 1 : 0]);
+ if (project_layers.length > 0) {
+ context_set_layer(project_layers[lpos > 0 ? lpos - 1 : 0]);
// Do not remove empty groups if the last layer is deleted as this prevents redo from working properly
@@ -220,8 +220,8 @@ class SlotLayer {
- Context.raw.layer_preview_dirty = true;
- Context.raw.ddirty = 3;
+ context_raw.layer_preview_dirty = true;
+ context_raw.ddirty = 3;
static invert_mask = (raw: SlotLayerRaw) => {
@@ -238,8 +238,8 @@ class SlotLayer {
base_notify_on_next_frame(_next);
raw.texpaint = render_path_render_targets.get("texpaint" + raw.id)._image = inverted;
static apply_mask = (raw: SlotLayerRaw) => {
@@ -258,7 +258,7 @@ class SlotLayer {
static duplicate = (raw: SlotLayerRaw): SlotLayerRaw => {
- let layers: SlotLayerRaw[] = Project.layers;
+ let layers: SlotLayerRaw[] = project_layers;
let i: i32 = layers.indexOf(raw) + 1;
let l: SlotLayerRaw = SlotLayer.create("", SlotLayer.is_layer(raw) ? layer_slot_type_t.LAYER : SlotLayer.is_mask(raw) ? layer_slot_type_t.MASK : layer_slot_type_t.GROUP, raw.parent);
layers.splice(i, 0, l);
@@ -324,8 +324,8 @@ class SlotLayer {
static resize_and_set_bits = (raw: SlotLayerRaw) => {
- let res_x: i32 = Config.get_texture_res_x();
- let res_y: i32 = Config.get_texture_res_y();
+ let res_x: i32 = config_get_texture_res_x();
+ let res_y: i32 = config_get_texture_res_y();
let rts: map_t<string, render_target_t> = render_path_render_targets;
if (base_pipe_merge == null) base_make_pipe();
@@ -402,22 +402,22 @@ class SlotLayer {
static to_fill_layer = (raw: SlotLayerRaw) => {
- Context.set_layer(raw);
- raw.fill_layer = Context.raw.material;
+ context_set_layer(raw);
+ raw.fill_layer = context_raw.material;
base_update_fill_layer();
let _next = () => {
UIBase.hwnds[tab_area_t.SIDEBAR0].redraws = 2;
static to_paint_layer = (raw: SlotLayerRaw) => {
raw.fill_layer = null;
@@ -427,7 +427,7 @@ class SlotLayer {
static get_children = (raw: SlotLayerRaw): SlotLayerRaw[] => {
let children: SlotLayerRaw[] = null; // Child layers of a group
if (l.parent == raw && SlotLayer.is_layer(l)) {
if (children == null) children = [];
children.push(l);
@@ -438,7 +438,7 @@ class SlotLayer {
static get_recursive_children = (raw: SlotLayerRaw): SlotLayerRaw[] => {
let children: SlotLayerRaw[] = null;
if (l.parent == raw) { // Child layers and group masks
@@ -456,7 +456,7 @@ class SlotLayer {
// Child masks of a layer
if (l.parent == raw && SlotLayer.is_mask(l)) {
@@ -465,7 +465,7 @@ class SlotLayer {
// Child masks of a parent group
if (includeGroupMasks) {
if (raw.parent != null && SlotLayer.is_group(raw.parent)) {
if (l.parent == raw.parent && SlotLayer.is_mask(l)) {
@@ -478,14 +478,14 @@ class SlotLayer {
static has_masks = (raw: SlotLayerRaw, includeGroupMasks = true): bool => {
// Layer mask
return true;
// Group mask
if (includeGroupMasks && raw.parent != null && SlotLayer.is_group(raw.parent)) {
@@ -557,25 +557,25 @@ class SlotLayer {
static can_move = (raw: SlotLayerRaw, to: i32): bool => {
- let old_index: i32 = Project.layers.indexOf(raw);
+ let old_index: i32 = project_layers.indexOf(raw);
let delta: i32 = to - old_index; // If delta > 0 the layer is moved up, otherwise down
- if (to < 0 || to > Project.layers.length - 1 || delta == 0) return false;
+ if (to < 0 || to > project_layers.length - 1 || delta == 0) return false;
// If the layer is moved up, all layers between the old position and the new one move one down.
// The layers above the new position stay where they are.
// If the new position is on top or on bottom no upper resp. lower layer exists.
- let new_upper_layer: SlotLayerRaw = delta > 0 ? (to < Project.layers.length - 1 ? Project.layers[to + 1] : null) : Project.layers[to];
+ let new_upper_layer: SlotLayerRaw = delta > 0 ? (to < project_layers.length - 1 ? project_layers[to + 1] : null) : project_layers[to];
// Group or layer is collapsed so we check below and update the upper layer.
if (new_upper_layer != null && !new_upper_layer.show_panel) {
let children: SlotLayerRaw[] = SlotLayer.get_recursive_children(new_upper_layer);
to -= children != null ? children.length : 0;
delta = to - old_index;
- new_upper_layer = delta > 0 ? (to < Project.layers.length - 1 ? Project.layers[to + 1] : null) : Project.layers[to];
+ new_upper_layer = delta > 0 ? (to < project_layers.length - 1 ? project_layers[to + 1] : null) : project_layers[to];
- let new_lower_layer: SlotLayerRaw = delta > 0 ? Project.layers[to] : (to > 0 ? Project.layers[to - 1] : null);
+ let new_lower_layer: SlotLayerRaw = delta > 0 ? project_layers[to] : (to > 0 ? project_layers[to - 1] : null);
if (SlotLayer.is_mask(raw)) {
// Masks can not be on top.
@@ -617,24 +617,24 @@ class SlotLayer {
let pointers: map_t<SlotLayerRaw, i32> = TabLayers.init_layer_map();
let delta: i32 = to - old_index;
- History.order_layers(to);
+ history_order_layers(to);
- Project.layers.splice(to, 0, raw);
+ project_layers.splice(to, 0, raw);
if (SlotLayer.is_layer(raw)) {
let old_parent: SlotLayerRaw = raw.parent;
@@ -657,9 +657,9 @@ class SlotLayer {
if (layer_masks != null) {
for (let idx: i32 = 0; idx < layer_masks.length; ++idx) {
let mask: SlotLayerRaw = layer_masks[idx];
- array_remove(Project.layers, mask);
+ array_remove(project_layers, mask);
// If the masks are moved down each step increases the index below the layer by one.
- Project.layers.splice(delta > 0 ? old_index + delta - 1 : old_index + delta + idx, 0, mask);
+ project_layers.splice(delta > 0 ? old_index + delta - 1 : old_index + delta + idx, 0, mask);
@@ -680,13 +680,13 @@ class SlotLayer {
if (children != null) {
for (let idx: i32 = 0; idx < children.length; ++idx) {
let child: SlotLayerRaw = children[idx];
- array_remove(Project.layers, child);
+ array_remove(project_layers, child);
// If the children are moved down each step increases the index below the layer by one.
- Project.layers.splice(delta > 0 ? old_index + delta - 1 : old_index + delta + idx, 0, child);
+ project_layers.splice(delta > 0 ? old_index + delta - 1 : old_index + delta + idx, 0, child);
- for (let m of Project.materials) TabLayers.remap_layer_pointers(m.canvas.nodes, TabLayers.fill_layer_map(pointers));
+ for (let m of project_materials) TabLayers.remap_layer_pointers(m.canvas.nodes, TabLayers.fill_layer_map(pointers));
@@ -24,7 +24,7 @@ class SlotMaterial {
static create(m: material_data_t = null, c: zui_node_canvas_t = null): SlotMaterialRaw {
let raw: SlotMaterialRaw = new SlotMaterialRaw();
- for (let mat of Project.materials) if (mat.id >= raw.id) raw.id = mat.id + 1;
+ for (let mat of project_materials) if (mat.id >= raw.id) raw.id = mat.id + 1;
raw.data = m;
let w: i32 = UtilRender.material_preview_size;
@@ -61,10 +61,10 @@ class SlotMaterial {
static delete = (raw: SlotMaterialRaw) => {
SlotMaterial.unload(raw);
- let mpos: i32 = Project.materials.indexOf(raw);
- array_remove(Project.materials, this);
- if (Project.materials.length > 0) {
- Context.set_material(Project.materials[mpos > 0 ? mpos - 1 : 0]);
+ let mpos: i32 = project_materials.indexOf(raw);
+ array_remove(project_materials, this);
+ if (project_materials.length > 0) {
+ context_set_material(project_materials[mpos > 0 ? mpos - 1 : 0]);
@@ -6,7 +6,7 @@ class TabLayers {
static show_context_menu: bool = false;
static draw = (htab: zui_handle_t) => {
- let mini: bool = Config.raw.layout[layout_size_t.SIDEBAR_W] <= UIBase.sidebar_mini_w;
+ let mini: bool = config_raw.layout[layout_size_t.SIDEBAR_W] <= UIBase.sidebar_mini_w;
mini ? TabLayers.draw_mini(htab) : TabLayers.draw_full(htab);
@@ -56,14 +56,14 @@ class TabLayers {
if (zui_button(tr("2D View"))) {
UIBase.show_2d_view(view_2d_type_t.LAYER);
- else if (ui.is_hovered) zui_tooltip(tr("Show 2D View") + ` (${Config.keymap.toggle_2d_view})`);
+ else if (ui.is_hovered) zui_tooltip(tr("Show 2D View") + ` (${config_keymap.toggle_2d_view})`);
static draw_slots = (mini: bool) => {
- if (i >= Project.layers.length) break; // Layer was deleted
- let j: i32 = Project.layers.length - 1 - i;
- let l: SlotLayerRaw = Project.layers[j];
+ if (i >= project_layers.length) break; // Layer was deleted
+ let j: i32 = project_layers.length - 1 - i;
+ let l: SlotLayerRaw = project_layers[j];
TabLayers.draw_layer_slot(l, j, mini);
@@ -82,10 +82,10 @@ class TabLayers {
static button_new = (text: string) => {
if (zui_button(text)) {
UIMenu.draw((ui: zui_t) => {
- let l: SlotLayerRaw = Context.raw.layer;
+ let l: SlotLayerRaw = context_raw.layer;
if (UIMenu.menu_button(ui, tr("Paint Layer"))) {
base_new_layer();
- History.new_layer();
+ history_new_layer();
if (UIMenu.menu_button(ui, tr("Fill Layer"))) {
base_create_fill_layer(uv_type_t.UVMAP);
@@ -94,45 +94,45 @@ class TabLayers {
base_create_fill_layer(uv_type_t.PROJECT);
if (UIMenu.menu_button(ui, tr("Black Mask"))) {
- if (SlotLayer.is_mask(l)) Context.set_layer(l.parent);
- // let l: SlotLayerRaw = Context.raw.layer;
+ if (SlotLayer.is_mask(l)) context_set_layer(l.parent);
+ // let l: SlotLayerRaw = raw.layer;
let m: SlotLayerRaw = base_new_mask(false, l);
SlotLayer.clear(m, 0x00000000);
- History.new_black_mask();
+ history_new_black_mask();
base_update_fill_layers();
if (UIMenu.menu_button(ui, tr("White Mask"))) {
SlotLayer.clear(m, 0xffffffff);
- History.new_white_mask();
+ history_new_white_mask();
if (UIMenu.menu_button(ui, tr("Fill Mask"))) {
let _init = () => {
SlotLayer.to_fill_layer(m);
app_notify_on_init(_init);
- History.new_fill_mask();
+ history_new_fill_mask();
- ui.enabled = !SlotLayer.is_group(Context.raw.layer) && !SlotLayer.is_in_group(Context.raw.layer);
+ ui.enabled = !SlotLayer.is_group(context_raw.layer) && !SlotLayer.is_in_group(context_raw.layer);
if (UIMenu.menu_button(ui, tr("Group"))) {
if (SlotLayer.is_group(l) || SlotLayer.is_in_group(l)) return;
@@ -140,13 +140,13 @@ class TabLayers {
let group = base_new_group();
- Context.set_layer(l);
- array_remove(Project.layers, group);
- Project.layers.splice(Project.layers.indexOf(l) + 1, 0, group);
+ context_set_layer(l);
+ array_remove(project_layers, group);
+ project_layers.splice(project_layers.indexOf(l) + 1, 0, group);
l.parent = group;
- Context.set_layer(group);
- History.new_group();
+ context_set_layer(group);
+ history_new_group();
ui.enabled = true;
}, 7);
@@ -155,27 +155,27 @@ class TabLayers {
static combo_filter = () => {
let ar: string[] = [tr("All")];
- for (let p of Project.paint_objects) ar.push(p.base.name);
- let atlases: string[] = Project.get_used_atlases();
+ for (let p of project_paint_objects) ar.push(p.base.name);
+ let atlases: string[] = project_get_used_atlases();
if (atlases != null) for (let a of atlases) ar.push(a);
let filter_handle: zui_handle_t = zui_handle("tablayers_0");
- filter_handle.position = Context.raw.layer_filter;
- Context.raw.layer_filter = zui_combo(filter_handle, ar, tr("Filter"), false, zui_align_t.LEFT);
+ filter_handle.position = context_raw.layer_filter;
+ context_raw.layer_filter = zui_combo(filter_handle, ar, tr("Filter"), false, zui_align_t.LEFT);
if (filter_handle.changed) {
- p.base.visible = Context.raw.layer_filter == 0 || p.base.name == ar[Context.raw.layer_filter] || Project.is_atlas_object(p);
+ p.base.visible = context_raw.layer_filter == 0 || p.base.name == ar[context_raw.layer_filter] || project_is_atlas_object(p);
- if (Context.raw.layer_filter == 0 && Context.raw.merged_object_is_atlas) { // All
+ if (context_raw.layer_filter == 0 && context_raw.merged_object_is_atlas) { // All
UtilMesh.merge_mesh();
- else if (Context.raw.layer_filter > Project.paint_objects.length) { // Atlas
+ else if (context_raw.layer_filter > project_paint_objects.length) { // Atlas
let visibles: mesh_object_t[] = [];
- for (let p of Project.paint_objects) if (p.base.visible) visibles.push(p);
+ for (let p of project_paint_objects) if (p.base.visible) visibles.push(p);
UtilMesh.merge_mesh(visibles);
base_set_object_mask();
UtilUV.uvmap_cached = false;
RenderPathRaytrace.ready = false;
@@ -195,13 +195,13 @@ class TabLayers {
static init_layer_map = (): Map<SlotLayerRaw, i32> => {
let res: Map<SlotLayerRaw, i32> = new Map();
- for (let i: i32 = 0; i < Project.layers.length; ++i) res.set(Project.layers[i], i);
+ for (let i: i32 = 0; i < project_layers.length; ++i) res.set(project_layers[i], i);
return res;
static fill_layer_map = (map: Map<SlotLayerRaw, i32>): Map<i32, i32> => {
let res: Map<i32, i32> = new Map();
- for (let l of map.keys()) res.set(map.get(l), Project.layers.indexOf(l) > -1 ? Project.layers.indexOf(l) : 9999);
+ for (let l of map.keys()) res.set(map.get(l), project_layers.indexOf(l) > -1 ? project_layers.indexOf(l) : 9999);
@@ -209,15 +209,15 @@ class TabLayers {
base_drag_off_x = offX;
base_drag_off_y = offY;
base_drag_layer = layer;
- Context.raw.drag_dest = Project.layers.indexOf(layer);
+ context_raw.drag_dest = project_layers.indexOf(layer);
static draw_layer_slot = (l: SlotLayerRaw, i: i32, mini: bool) => {
let ui: zui_t = UIBase.ui;
- if (Context.raw.layer_filter > 0 &&
+ if (context_raw.layer_filter > 0 &&
SlotLayer.get_object_mask(l) > 0 &&
- SlotLayer.get_object_mask(l) != Context.raw.layer_filter) {
+ SlotLayer.get_object_mask(l) != context_raw.layer_filter) {
@@ -233,37 +233,37 @@ class TabLayers {
// Highlight drag destination
let absy: f32 = ui._window_y + ui._y;
- if (base_is_dragging && base_drag_layer != null && Context.in_layers()) {
+ if (base_is_dragging && base_drag_layer != null && context_in_layers()) {
if (mouse_y > absy + step && mouse_y < absy + step * 3) {
- let down: bool = Project.layers.indexOf(base_drag_layer) >= i;
- Context.raw.drag_dest = down ? i : i - 1;
+ let down: bool = project_layers.indexOf(base_drag_layer) >= i;
+ context_raw.drag_dest = down ? i : i - 1;
- let ls: SlotLayerRaw[] = Project.layers;
- let dest: i32 = Context.raw.drag_dest;
+ let ls: SlotLayerRaw[] = project_layers;
+ let dest: i32 = context_raw.drag_dest;
let to_group: bool = down ? dest > 0 && ls[dest - 1].parent != null && ls[dest - 1].parent.show_panel : dest < ls.length && ls[dest].parent != null && ls[dest].parent.show_panel;
let nested_group: bool = SlotLayer.is_group(base_drag_layer) && to_group;
if (!nested_group) {
- if (SlotLayer.can_move(Context.raw.layer, Context.raw.drag_dest)) {
+ if (SlotLayer.can_move(context_raw.layer, context_raw.drag_dest)) {
zui_fill(checkw, step * 2, (ui._window_w / zui_SCALE(ui) - 2) - checkw, 2 * zui_SCALE(ui), ui.t.HIGHLIGHT_COL);
- else if (i == Project.layers.length - 1 && mouse_y < absy + step) {
- Context.raw.drag_dest = Project.layers.length - 1;
+ else if (i == project_layers.length - 1 && mouse_y < absy + step) {
+ context_raw.drag_dest = project_layers.length - 1;
zui_fill(checkw, 0, (ui._window_w / zui_SCALE(ui) - 2) - checkw, 2 * zui_SCALE(ui), ui.t.HIGHLIGHT_COL);
- if (base_is_dragging && (base_drag_material != null || base_drag_swatch != null) && Context.in_layers()) {
+ if (base_is_dragging && (base_drag_material != null || base_drag_swatch != null) && context_in_layers()) {
- Context.raw.drag_dest = i;
+ context_raw.drag_dest = i;
if (TabLayers.can_drop_new_layer(i))
zui_fill(checkw, 2 * step, (ui._window_w / zui_SCALE(ui) - 2) - checkw, 2 * zui_SCALE(ui), ui.t.HIGHLIGHT_COL);
- Context.raw.drag_dest = Project.layers.length;
- if (TabLayers.can_drop_new_layer(Project.layers.length))
+ context_raw.drag_dest = project_layers.length;
+ if (TabLayers.can_drop_new_layer(project_layers.length))
@@ -305,8 +305,8 @@ class TabLayers {
// Draw eye icon
- let icons: image_t = Res.get("icons.k");
- let r: rect_t = Res.tile18(icons, l.visible ? 0 : 1, 0);
+ let icons: image_t = resource_get("icons.k");
+ let r: rect_t = resource_tile18(icons, l.visible ? 0 : 1, 0);
let center: f32 = (step / 2) * zui_SCALE(ui);
ui._x += 2;
ui._y += 3;
@@ -340,7 +340,7 @@ class TabLayers {
ui._x -= 2;
ui._y -= 3;
- if (Config.raw.touch_ui) {
+ if (config_raw.touch_ui) {
ui._x += 12 * zui_SCALE(ui);
@@ -362,31 +362,31 @@ class TabLayers {
ui.input_x > ui._window_x + ui._x && ui.input_x < ui._window_x + ui._window_w &&
ui.input_y > ui._window_y + ui._y - center && ui.input_y < ui._window_y + ui._y - center + (step * zui_SCALE(ui)) * 2) {
if (ui.input_started) {
- TabLayers.set_drag_layer(Context.raw.layer, -(mouse_x - uix - ui._window_x - 3), -(mouse_y - uiy - ui._window_y + 1));
+ TabLayers.set_drag_layer(context_raw.layer, -(mouse_x - uix - ui._window_x - 3), -(mouse_y - uiy - ui._window_y + 1));
else if (ui.input_released_r) {
TabLayers.show_context_menu = true;
let state: zui_state_t = zui_text(l.name);
if (state == zui_state_t.RELEASED) {
- if (time_time() - Context.raw.select_time < 0.25) {
+ if (time_time() - context_raw.select_time < 0.25) {
TabLayers.layer_name_edit = l.id;
TabLayers.layer_name_handle.text = l.name;
zui_start_text_edit(TabLayers.layer_name_handle);
- Context.raw.select_time = time_time();
+ context_raw.select_time = time_time();
let in_focus: bool = ui.input_x > ui._window_x && ui.input_x < ui._window_x + ui._window_w &&
ui.input_y > ui._window_y && ui.input_y < ui._window_y + ui._window_h;
- if (in_focus && ui.is_delete_down && TabLayers.can_delete(Context.raw.layer)) {
+ if (in_focus && ui.is_delete_down && TabLayers.can_delete(context_raw.layer)) {
ui.is_delete_down = false;
- TabLayers.delete_layer(Context.raw.layer);
+ TabLayers.delete_layer(context_raw.layer);
@@ -433,7 +433,7 @@ class TabLayers {
zui_end_element();
@@ -446,18 +446,18 @@ class TabLayers {
static combo_object = (ui: zui_t, l: SlotLayerRaw, label = false): zui_handle_t => {
let ar: string[] = [tr("Shared")];
let object_handle: zui_handle_t = zui_nest(zui_handle("tablayers_2"), l.id);
object_handle.position = l.object_mask;
l.object_mask = zui_combo(object_handle, ar, tr("Object"), label, zui_align_t.LEFT);
if (object_handle.changed) {
MakeMaterial.parse_mesh_material();
if (l.fill_layer != null) { // Fill layer
- Context.raw.material = l.fill_layer;
+ context_raw.material = l.fill_layer;
SlotLayer.clear(l);
@@ -494,8 +494,8 @@ class TabLayers {
tr("Value"),
], tr("Blending"), label);
if (blending_handle.changed) {
- History.layer_blending();
+ history_layer_blending();
l.blending = blending_handle.position;
@@ -516,7 +516,7 @@ class TabLayers {
zui_fill(0, 0, (ui._w / zui_SCALE(ui) - 2), 1 * zui_SCALE(ui), ui.t.SEPARATOR_COL);
// Highlight selected
- if (Context.raw.layer == l) {
+ if (context_raw.layer == l) {
if (mini) {
zui_rect(1, -step * 2, ui._w / zui_SCALE(ui) - 1, step * 2 + (mini ? -1 : 1), ui.t.HIGHLIGHT_COL, 3);
@@ -542,39 +542,39 @@ class TabLayers {
if (ui.is_hovered && texpaint_preview != null) {
if (SlotLayer.is_mask(l)) {
TabLayers.make_mask_preview_rgba32(l);
- zui_tooltip_image(Context.raw.mask_preview_rgba32);
+ zui_tooltip_image(context_raw.mask_preview_rgba32);
zui_tooltip_image(texpaint_preview);
- if (i < 9) zui_tooltip(l.name + " - (" + Config.keymap.select_layer + " " + (i + 1) + ")");
+ if (i < 9) zui_tooltip(l.name + " - (" + config_keymap.select_layer + " " + (i + 1) + ")");
else zui_tooltip(l.name);
// Show context menu
if (state == zui_state_t.STARTED) {
else if (state == zui_state_t.RELEASED) {
- if (time_time() - Context.raw.select_time < 0.2) {
+ if (time_time() - context_raw.select_time < 0.2) {
- if (time_time() - Context.raw.select_time > 0.2) {
+ if (time_time() - context_raw.select_time > 0.2) {
- if (l.fill_layer != null) Context.set_material(l.fill_layer);
+ if (l.fill_layer != null) context_set_material(l.fill_layer);
static draw_layer_icon = (l: SlotLayerRaw, i: i32, uix: f32, uiy: f32, mini: bool) => {
let icon_h: i32 = (zui_ELEMENT_H(ui) - (mini ? 2 : 3)) * 2;
if (mini && zui_SCALE(ui) > 1) {
@@ -601,7 +601,7 @@ class TabLayers {
let icon: image_t = l.fill_layer == null ? texpaint_preview : l.fill_layer.image_icon;
if (l.fill_layer == null) {
// Checker
- let r: rect_t = Res.tile50(icons, 4, 1);
+ let r: rect_t = resource_tile50(icons, 4, 1);
let _x: f32 = ui._x;
let _y: f32 = ui._y;
let _w: f32 = ui._w;
@@ -628,7 +628,7 @@ class TabLayers {
// Draw layer numbers when selecting a layer via keyboard shortcut
let is_typing: bool = ui.is_typing || UIView2D.ui.is_typing || UINodes.ui.is_typing;
if (!is_typing) {
- if (i < 9 && Operator.shortcut(Config.keymap.select_layer, ShortcutType.ShortcutDown)) {
+ if (i < 9 && operator_shortcut(config_keymap.select_layer, shortcut_type_t.DOWN)) {
let number: string = String(i + 1) ;
let width: i32 = g2_font_width(ui.font, ui.font_size, number) + 10;
let height: i32 = g2_font_height(ui.font, ui.font_size);
@@ -642,23 +642,23 @@ class TabLayers {
return state;
else { // Group
- let folder_closed: rect_t = Res.tile50(icons, 2, 1);
- let folder_open: rect_t = Res.tile50(icons, 8, 1);
+ let folder_closed: rect_t = resource_tile50(icons, 2, 1);
+ let folder_open: rect_t = resource_tile50(icons, 8, 1);
let folder: rect_t = l.show_panel ? folder_open : folder_closed;
return zui_image(icons, ui.t.LABEL_COL - 0x00202020, icon_h, folder.x, folder.y, folder.w, folder.h);
static can_merge_down = (l: SlotLayerRaw) : bool => {
- let index: i32 = Project.layers.indexOf(l);
+ let index: i32 = project_layers.indexOf(l);
// Lowest layer
if (index == 0) return false;
// Lowest layer that has masks
- if (SlotLayer.is_layer(l) && SlotLayer.is_mask(Project.layers[0]) && Project.layers[0].parent == l) return false;
+ if (SlotLayer.is_layer(l) && SlotLayer.is_mask(project_layers[0]) && project_layers[0].parent == l) return false;
// The lowest toplevel layer is a group
- if (SlotLayer.is_group(l) && SlotLayer.is_in_group(Project.layers[0]) && SlotLayer.get_containing_group(Project.layers[0]) == l) return false;
+ if (SlotLayer.is_group(l) && SlotLayer.is_in_group(project_layers[0]) && SlotLayer.get_containing_group(project_layers[0]) == l) return false;
// Masks must be merged down to masks
- if (SlotLayer.is_mask(l) && !SlotLayer.is_mask(Project.layers[index - 1])) return false;
+ if (SlotLayer.is_mask(l) && !SlotLayer.is_mask(project_layers[index - 1])) return false;
@@ -708,12 +708,12 @@ class TabLayers {
let f: string = UIFiles.filename;
if (f == "") f = tr("untitled");
if (!f.endsWith(".png")) f += ".png";
- krom_write_png(path + Path.sep + f, image_get_pixels(l.texpaint), l.texpaint.width, l.texpaint.height, 3); // RRR1
+ krom_write_png(path + path_sep + f, image_get_pixels(l.texpaint), l.texpaint.width, l.texpaint.height, 3); // RRR1
- Context.raw.layers_export = export_mode_t.SELECTED;
+ context_raw.layers_export = export_mode_t.SELECTED;
BoxExport.show_textures();
@@ -725,14 +725,14 @@ class TabLayers {
if (l.fill_layer == null && UIMenu.menu_button(ui, to_fill_string)) {
- SlotLayer.is_layer(l) ? History.to_fill_layer() : History.to_fill_mask();
+ SlotLayer.is_layer(l) ? history_to_fill_layer() : history_to_fill_mask();
SlotLayer.to_fill_layer(l);
if (l.fill_layer != null && UIMenu.menu_button(ui, to_paint_string)) {
- SlotLayer.is_layer(l) ? History.to_paint_layer() : History.to_paint_mask();
+ SlotLayer.is_layer(l) ? history_to_paint_layer() : history_to_paint_mask();
SlotLayer.to_paint_layer(l);
@@ -742,47 +742,47 @@ class TabLayers {
ui.enabled = TabLayers.can_delete(l);
if (UIMenu.menu_button(ui, tr("Delete"), "delete")) {
if (l.fill_layer == null && UIMenu.menu_button(ui, tr("Clear"))) {
if (!SlotLayer.is_group(l)) {
- History.clear_layer();
+ history_clear_layer();
for (let c of SlotLayer.get_children(l)) {
- Context.raw.layer = c;
+ context_raw.layer = c;
SlotLayer.clear(c);
- Context.raw.layers_preview_dirty = true;
- Context.raw.layer = l;
+ context_raw.layers_preview_dirty = true;
+ context_raw.layer = l;
if (SlotLayer.is_mask(l) && l.fill_layer == null && UIMenu.menu_button(ui, tr("Invert"))) {
- History.invert_mask();
+ history_invert_mask();
SlotLayer.invert_mask(l);
if (SlotLayer.is_mask(l) && UIMenu.menu_button(ui, tr("Apply"))) {
- History.apply_mask();
+ history_apply_mask();
SlotLayer.apply_mask(l);
- Context.set_layer(l.parent);
+ context_set_layer(l.parent);
@@ -795,18 +795,18 @@ class TabLayers {
ui.enabled = TabLayers.can_merge_down(l);
if (UIMenu.menu_button(ui, tr("Merge Down"))) {
- History.merge_layers();
+ history_merge_layers();
base_merge_down();
- if (Context.raw.layer.fill_layer != null) SlotLayer.to_paint_layer(Context.raw.layer);
+ if (context_raw.layer.fill_layer != null) SlotLayer.to_paint_layer(context_raw.layer);
if (UIMenu.menu_button(ui, tr("Duplicate"))) {
- History.duplicate_layer();
+ history_duplicate_layer();
base_duplicate_layer(l);
@@ -818,7 +818,7 @@ class TabLayers {
layer_opac_handle.value = l.mask_opacity;
zui_slider(layer_opac_handle, tr("Opacity"), 0.0, 1.0, true);
if (layer_opac_handle.changed) {
- if (ui.input_started) History.layer_opacity();
+ if (ui.input_started) history_layer_opacity();
l.mask_opacity = layer_opac_handle.value;
UIMenu.keep_open = true;
@@ -866,8 +866,8 @@ class TabLayers {
scale_handle.value = l.scale;
l.scale = zui_slider(scale_handle, tr("UV Scale"), 0.0, 5.0, true);
if (scale_handle.changed) {
- Context.set_material(l.fill_layer);
+ context_set_material(l.fill_layer);
@@ -881,8 +881,8 @@ class TabLayers {
angle_handle.value = l.angle;
l.angle = zui_slider(angle_handle, tr("Angle"), 0.0, 360, true, 1);
if (angle_handle.changed) {
@@ -897,8 +897,8 @@ class TabLayers {
uv_type_handle.position = l.uv_type;
l.uv_type = zui_inline_radio(uv_type_handle, [tr("UV Map"), tr("Triplanar"), tr("Project")], zui_align_t.LEFT);
if (uv_type_handle.changed) {
@@ -973,14 +973,14 @@ class TabLayers {
static make_mask_preview_rgba32 = (l: SlotLayerRaw) => {
- if (Context.raw.mask_preview_rgba32 == null) {
- Context.raw.mask_preview_rgba32 = image_create_render_target(UtilRender.layer_preview_size, UtilRender.layer_preview_size);
+ if (context_raw.mask_preview_rgba32 == null) {
+ context_raw.mask_preview_rgba32 = image_create_render_target(UtilRender.layer_preview_size, UtilRender.layer_preview_size);
// Convert from R8 to RGBA32 for tooltip display
- if (Context.raw.mask_preview_last != l) {
- Context.raw.mask_preview_last = l;
+ if (context_raw.mask_preview_last != l) {
+ context_raw.mask_preview_last = l;
app_notify_on_init(() => {
- g2_begin(Context.raw.mask_preview_rgba32);
+ g2_begin(context_raw.mask_preview_rgba32);
g2_set_pipeline(UIView2D.pipe);
g4_set_int(UIView2D.channel_location, 1);
g2_draw_image(l.texpaint_preview, 0, 0);
@@ -996,8 +996,8 @@ class TabLayers {
if (SlotLayer.is_layer(l) && SlotLayer.has_masks(l, false)) {
for (let m of SlotLayer.get_masks(l, false)) {
- Context.raw.layer = m;
- History.delete_layer();
+ context_raw.layer = m;
+ history_delete_layer();
SlotLayer.delete(m);
@@ -1005,30 +1005,30 @@ class TabLayers {
if (SlotLayer.has_masks(c, false)) {
for (let m of SlotLayer.get_masks(c, false)) {
SlotLayer.delete(c);
if (SlotLayer.has_masks(l)) {
for (let m of SlotLayer.get_masks(l)) {
SlotLayer.delete(l);
- Context.raw.layer = l.parent;
+ context_raw.layer = l.parent;
@@ -1038,17 +1038,17 @@ class TabLayers {
// Maybe some group masks are left
if (SlotLayer.has_masks(g)) {
for (let m of SlotLayer.get_masks(g)) {
SlotLayer.delete(l.parent);
static can_delete = (l: SlotLayerRaw) => {
@@ -1056,7 +1056,7 @@ class TabLayers {
if (SlotLayer.is_mask(l)) return true;
- for (let slot of Project.layers) {
+ for (let slot of project_layers) {
if (SlotLayer.is_layer(slot)) ++num_layers;
@@ -1068,7 +1068,7 @@ class TabLayers {
static can_drop_new_layer = (position: i32) => {
- if (position > 0 && position < Project.layers.length && SlotLayer.is_mask(Project.layers[position - 1])) {
+ if (position > 0 && position < project_layers.length && SlotLayer.is_mask(project_layers[position - 1])) {
// 1. The layer to insert is inserted in the middle
// 2. The layer below is a mask, i.e. the layer would have to be a (group) mask, too.
@@ -5,13 +5,13 @@ class BrushOutputNode extends LogicNode {
constructor() {
super();
- Context.raw.run_brush = this.run;
- Context.raw.parse_brush_inputs = this.parse_inputs;
+ context_raw.run_brush = this.run;
+ context_raw.parse_brush_inputs = this.parse_inputs;
parse_inputs = () => {
- let last_mask: image_t = Context.raw.brush_mask_image;
- let last_stencil: image_t = Context.raw.brush_stencil_image;
+ let last_mask: image_t = context_raw.brush_mask_image;
+ let last_stencil: image_t = context_raw.brush_stencil_image;
let input0: any;
let input1: any;
@@ -33,77 +33,77 @@ class BrushOutputNode extends LogicNode {
- Context.raw.paint_vec = input0;
- Context.raw.brush_nodes_radius = input1;
- Context.raw.brush_nodes_scale = input2;
- Context.raw.brush_nodes_angle = input3;
+ context_raw.paint_vec = input0;
+ context_raw.brush_nodes_radius = input1;
+ context_raw.brush_nodes_scale = input2;
+ context_raw.brush_nodes_angle = input3;
let opac: any = input4; // Float or texture name
if (opac == null) opac = 1.0;
if (typeof opac == "string") {
- Context.raw.brush_mask_image_is_alpha = opac.endsWith(".a");
+ context_raw.brush_mask_image_is_alpha = opac.endsWith(".a");
opac = opac.substr(0, opac.lastIndexOf("."));
- Context.raw.brush_nodes_opacity = 1.0;
- let index: i32 = Project.asset_names.indexOf(opac);
- let asset: asset_t = Project.assets[index];
- Context.raw.brush_mask_image = Project.get_image(asset);
+ context_raw.brush_nodes_opacity = 1.0;
+ let index: i32 = project_asset_names.indexOf(opac);
+ let asset: asset_t = project_assets[index];
+ context_raw.brush_mask_image = project_get_image(asset);
- Context.raw.brush_nodes_opacity = opac;
- Context.raw.brush_mask_image = null;
+ context_raw.brush_nodes_opacity = opac;
+ context_raw.brush_mask_image = null;
- Context.raw.brush_nodes_hardness = input5;
+ context_raw.brush_nodes_hardness = input5;
let stencil: any = input6; // Float or texture name
if (stencil == null) stencil = 1.0;
if (typeof stencil == "string") {
- Context.raw.brush_stencil_image_is_alpha = stencil.endsWith(".a");
+ context_raw.brush_stencil_image_is_alpha = stencil.endsWith(".a");
stencil = stencil.substr(0, stencil.lastIndexOf("."));
- let index: i32 = Project.asset_names.indexOf(stencil);
- Context.raw.brush_stencil_image = Project.get_image(asset);
+ let index: i32 = project_asset_names.indexOf(stencil);
+ context_raw.brush_stencil_image = project_get_image(asset);
- Context.raw.brush_stencil_image = null;
+ context_raw.brush_stencil_image = null;
- if (last_mask != Context.raw.brush_mask_image ||
- last_stencil != Context.raw.brush_stencil_image) {
+ if (last_mask != context_raw.brush_mask_image ||
+ last_stencil != context_raw.brush_stencil_image) {
- Context.raw.brush_directional = this.Directional;
+ context_raw.brush_directional = this.Directional;
run = (from: i32) => {
let left: f32 = 0.0;
let right: f32 = 1.0;
left = 1.0;
- right = (Context.raw.split_view ? 2.0 : 1.0) + UIView2D.ww / base_w();
+ right = (context_raw.split_view ? 2.0 : 1.0) + UIView2D.ww / base_w();
// First time init
- if (Context.raw.last_paint_x < 0 || Context.raw.last_paint_y < 0) {
+ if (context_raw.last_paint_x < 0 || context_raw.last_paint_y < 0) {
// Do not paint over fill layer
// Do not paint over groups
// Paint bounds
- if (Context.raw.paint_vec.x > left &&
- Context.raw.paint_vec.x < right &&
- Context.raw.paint_vec.y > 0 &&
- Context.raw.paint_vec.y < 1 &&
+ if (context_raw.paint_vec.x > left &&
+ context_raw.paint_vec.x < right &&
+ context_raw.paint_vec.y > 0 &&
+ context_raw.paint_vec.y < 1 &&
!fill_layer &&
!group_layer &&
- (SlotLayer.is_visible(Context.raw.layer) || Context.raw.paint2d) &&
+ (SlotLayer.is_visible(context_raw.layer) || context_raw.paint2d) &&
!UIBase.ui.is_hovered &&
!base_is_dragging &&
!base_is_resizing &&
@@ -112,34 +112,34 @@ class BrushOutputNode extends LogicNode {
// Set color pick
let down: bool = mouse_down() || pen_down();
- if (down && Context.raw.tool == workspace_tool_t.COLORID && Project.assets.length > 0) {
- Context.raw.colorid_picked = true;
+ if (down && context_raw.tool == workspace_tool_t.COLORID && project_assets.length > 0) {
+ context_raw.colorid_picked = true;
UIToolbar.toolbar_handle.redraws = 1;
// Prevent painting the same spot
- let same_spot: bool = Context.raw.paint_vec.x == Context.raw.last_paint_x && Context.raw.paint_vec.y == Context.raw.last_paint_y;
- let lazy: bool = Context.raw.tool == workspace_tool_t.BRUSH && Context.raw.brush_lazy_radius > 0;
+ let same_spot: bool = context_raw.paint_vec.x == context_raw.last_paint_x && context_raw.paint_vec.y == context_raw.last_paint_y;
+ let lazy: bool = context_raw.tool == workspace_tool_t.BRUSH && context_raw.brush_lazy_radius > 0;
if (down && (same_spot || lazy)) {
- Context.raw.painted++;
+ context_raw.painted++;
- Context.raw.painted = 0;
+ context_raw.painted = 0;
- Context.raw.last_paint_x = Context.raw.paint_vec.x;
- Context.raw.last_paint_y = Context.raw.paint_vec.y;
+ context_raw.last_paint_x = context_raw.paint_vec.x;
+ context_raw.last_paint_y = context_raw.paint_vec.y;
- if (Context.raw.tool == workspace_tool_t.PARTICLE) {
- Context.raw.painted = 0; // Always paint particles
+ if (context_raw.tool == workspace_tool_t.PARTICLE) {
+ context_raw.painted = 0; // Always paint particles
- if (Context.raw.painted == 0) {
+ if (context_raw.painted == 0) {
this.parse_inputs();
- if (Context.raw.painted <= 1) {
+ if (context_raw.painted <= 1) {
@@ -25,16 +25,16 @@ class InputNode extends LogicNode {
update = () => {
- if (Context.raw.split_view) {
- Context.raw.view_index = mouse_view_x() > base_w() / 2 ? 1 : 0;
+ if (context_raw.split_view) {
+ context_raw.view_index = mouse_view_x() > base_w() / 2 ? 1 : 0;
- let decal_mask: bool = decal && Operator.shortcut(Config.keymap.decal_mask + "+" + Config.keymap.action_paint, ShortcutType.ShortcutDown);
+ let decal_mask: bool = decal && operator_shortcut(config_keymap.decal_mask + "+" + config_keymap.action_paint, shortcut_type_t.DOWN);
- let lazy_paint: bool = Context.raw.brush_lazy_radius > 0 &&
- (Operator.shortcut(Config.keymap.action_paint, ShortcutType.ShortcutDown) ||
- Operator.shortcut(Config.keymap.brush_ruler + "+" + Config.keymap.action_paint, ShortcutType.ShortcutDown) ||
+ let lazy_paint: bool = context_raw.brush_lazy_radius > 0 &&
+ (operator_shortcut(config_keymap.action_paint, shortcut_type_t.DOWN) ||
+ operator_shortcut(config_keymap.brush_ruler + "+" + config_keymap.action_paint, shortcut_type_t.DOWN) ||
decal_mask);
let paint_x: f32 = mouse_view_x() / app_w();
@@ -53,22 +53,22 @@ class InputNode extends LogicNode {
InputNode.startY = pen_view_y() / app_h();
- if (Operator.shortcut(Config.keymap.brush_ruler + "+" + Config.keymap.action_paint, ShortcutType.ShortcutDown)) {
+ if (operator_shortcut(config_keymap.brush_ruler + "+" + config_keymap.action_paint, shortcut_type_t.DOWN)) {
if (InputNode.lock_x) paint_x = InputNode.startX;
if (InputNode.lock_y) paint_y = InputNode.startY;
- if (Context.raw.brush_lazy_radius > 0) {
- Context.raw.brush_lazy_x = paint_x;
- Context.raw.brush_lazy_y = paint_y;
+ if (context_raw.brush_lazy_radius > 0) {
+ context_raw.brush_lazy_x = paint_x;
+ context_raw.brush_lazy_y = paint_y;
if (!lazy_paint) {
InputNode.coords.x = paint_x;
InputNode.coords.y = paint_y;
- Context.raw.view_index = -1;
+ context_raw.view_index = -1;
if (InputNode.lock_begin) {
@@ -80,44 +80,44 @@ class InputNode extends LogicNode {
- if (keyboard_started(Config.keymap.brush_ruler)) {
+ if (keyboard_started(config_keymap.brush_ruler)) {
InputNode.lock_start_x = mouse_view_x();
InputNode.lock_start_y = mouse_view_y();
InputNode.lock_begin = true;
- else if (keyboard_released(Config.keymap.brush_ruler)) {
+ else if (keyboard_released(config_keymap.brush_ruler)) {
InputNode.lock_x = InputNode.lock_y = InputNode.lock_begin = false;
- let v1: vec4_t = vec4_create(Context.raw.brush_lazy_x * app_w(), Context.raw.brush_lazy_y * app_h(), 0.0);
+ let v1: vec4_t = vec4_create(context_raw.brush_lazy_x * app_w(), context_raw.brush_lazy_y * app_h(), 0.0);
let v2: vec4_t = vec4_create(InputNode.coords.x * app_w(), InputNode.coords.y * app_h(), 0.0);
let d: f32 = vec4_dist(v1, v2);
- let r: f32 = Context.raw.brush_lazy_radius * 85;
+ let r: f32 = context_raw.brush_lazy_radius * 85;
if (d > r) {
let v3: vec4_t = vec4_create();
vec4_sub_vecs(v3, v2, v1);
vec4_normalize(v3, );
- vec4_mult(v3, 1.0 - Context.raw.brush_lazy_step);
+ vec4_mult(v3, 1.0 - context_raw.brush_lazy_step);
vec4_mult(v3, r);
vec4_add_vecs(v2, v1, v3);
InputNode.coords.x = v2.x / app_w();
InputNode.coords.y = v2.y / app_h();
// Parse brush inputs once on next draw
- Context.raw.painted = -1;
+ context_raw.painted = -1;
- Context.raw.last_paint_x = -1;
- Context.raw.last_paint_y = -1;
+ context_raw.last_paint_x = -1;
+ context_raw.last_paint_y = -1;
- Context.raw.parse_brush_inputs();
+ context_raw.parse_brush_inputs();
override get = (from: i32, done: (a: any)=>void) => {
this.inputs[0].get((value) => {
- Context.raw.brush_lazy_radius = value;
+ context_raw.brush_lazy_radius = value;
this.inputs[1].get((value) => {
- Context.raw.brush_lazy_step = value;
+ context_raw.brush_lazy_step = value;
done(InputNode.coords);
@@ -11,7 +11,7 @@ class ExportObj {
let o: i32[] = [];
ExportObj.writeString(o, "# armorsculpt.org\n");
- let texpaint = Project.layers[0].texpaint;
+ let texpaint = project_layers[0].texpaint;
let pixels = image_get_pixels(texpaint);
let pixelsView = new DataView(pixels);
let mesh = paintObjects[0].data;
@@ -4,74 +4,74 @@ class ImportMesh {
static clearLayers = true;
static run = (path: string, _clearLayers = true, replaceExisting = true) => {
- if (!Path.isMesh(path)) {
- if (!Context.enableImportPlugin(path)) {
- Console.error(Strings.error1());
+ if (!path_isMesh(path)) {
+ if (!context_enableImportPlugin(path)) {
+ console_error(Strings.error1());
ImportMesh.clearLayers = _clearLayers;
- Context.raw.layerFilter = 0;
+ context_raw.layerFilter = 0;
let p = path.toLowerCase();
if (p.endsWith(".obj")) ImportObj.run(path, replaceExisting);
else if (p.endsWith(".blend")) ImportBlendMesh.run(path, replaceExisting);
let ext = path.substr(path.lastIndexOf(".") + 1);
- let importer = Path.meshImporters.get(ext);
+ let importer = path_meshImporters.get(ext);
importer(path, (mesh: any) => {
replaceExisting ? ImportMesh.makeMesh(mesh, path) : ImportMesh.addMesh(mesh);
- Project.meshAssets = [path];
+ project_meshAssets = [path];
///if (krom_android || krom_ios)
- sys_title_set(path.substring(path.lastIndexOf(Path.sep) + 1, path.lastIndexOf(".")));
+ sys_title_set(path.substring(path.lastIndexOf(path_sep) + 1, path.lastIndexOf(".")));
static finishImport = () => {
- if (Context.raw.mergedObject != null) {
- mesh_object_remove(Context.raw.mergedObject);
- data_delete_mesh(Context.raw.mergedObject.data._.handle);
- Context.raw.mergedObject = null;
+ if (context_raw.mergedObject != null) {
+ mesh_object_remove(context_raw.mergedObject);
+ data_delete_mesh(context_raw.mergedObject.data._.handle);
+ context_raw.mergedObject = null;
- Context.selectPaintObject(Context.mainObject());
+ context_selectPaintObject(context_mainObject());
- if (Project.paintObjects.length > 1) {
+ if (project_paintObjects.length > 1) {
// Sort by name
- Project.paintObjects.sort((a, b): i32 => {
+ project_paintObjects.sort((a, b): i32 => {
if (a.base.name < b.base.name) return -1;
else if (a.base.name > b.base.name) return 1;
return 0;
// No mask by default
- for (let p of Project.paintObjects) p.base.visible = true;
- if (Context.raw.mergedObject == null) UtilMesh.mergeMesh();
- Context.raw.paintObject.skip_context = "paint";
- Context.raw.mergedObject.base.visible = true;
+ for (let p of project_paintObjects) p.base.visible = true;
+ if (context_raw.mergedObject == null) UtilMesh.mergeMesh();
+ context_raw.paintObject.skip_context = "paint";
+ context_raw.mergedObject.base.visible = true;
Viewport.scaleToBounds();
- if (Context.raw.paintObject.base.name == "") Context.raw.paintObject.base.name = "Object";
+ if (context_raw.paintObject.base.name == "") context_raw.paintObject.base.name = "Object";
MakeMaterial.parsePaintMaterial();
MakeMaterial.parseMeshMaterial();
- Context.raw.paintBody = null;
+ context_raw.paintBody = null;
static makeMesh = (mesh: any, path: string) => {
if (mesh == null || mesh.posa == null || mesh.nora == null || mesh.inda == null || mesh.posa.length == 0) {
- Console.error(Strings.error3());
+ console_error(Strings.error3());
@@ -80,38 +80,38 @@ class ImportMesh {
if (mesh.cola != null) raw.vertex_arrays.push({ values: mesh.cola, attrib: "col", data: "short4norm" });
let md: mesh_data_t = mesh_data_create(raw);
- Context.raw.paintObject = Context.mainObject();
+ context_raw.paintObject = context_mainObject();
- for (let i = 0; i < Project.paintObjects.length; ++i) {
- let p = Project.paintObjects[i];
- if (p == Context.raw.paintObject) continue;
+ for (let i = 0; i < project_paintObjects.length; ++i) {
+ let p = project_paintObjects[i];
+ if (p == context_raw.paintObject) continue;
data_delete_mesh(p.data._.handle);
mesh_object_remove(p);
- let handle = Context.raw.paintObject.data._.handle;
+ let handle = context_raw.paintObject.data._.handle;
if (handle != "SceneSphere" && handle != "ScenePlane") {
data_delete_mesh(handle);
if (ImportMesh.clearLayers) {
- while (Project.layers.length > 0) {
- let l = Project.layers.pop();
+ while (project_layers.length > 0) {
+ let l = project_layers.pop();
SlotLayer.unload(l);
base_newLayer(false);
app_notify_on_init(base_initLayers);
- History.reset();
+ history_reset();
- mesh_object_set_data(Context.raw.paintObject, md);
- Context.raw.paintObject.base.name = mesh.name;
- Project.paintObjects = [Context.raw.paintObject];
+ mesh_object_set_data(context_raw.paintObject, md);
+ context_raw.paintObject.base.name = mesh.name;
+ project_paintObjects = [context_raw.paintObject];
md._.handle = raw.name;
data_cached_meshes.set(md._.handle, md);
- Context.raw.ddirty = 4;
+ context_raw.ddirty = 4;
UIBase.hwnds[TabArea.TabSidebar0].redraws = 2;
UIBase.hwnds[TabArea.TabSidebar1].redraws = 2;
@@ -119,7 +119,7 @@ class ImportMesh {
app_notify_on_init(ImportMesh.finishImport);
- let f32 = new Float32Array(Config.getTextureResX() * Config.getTextureResY() * 4);
+ let f32 = new Float32Array(config_getTextureResX() * config_getTextureResY() * 4);
for (let i = 0; i < Math.floor(mesh.inda.length); ++i) {
let index = mesh.inda[i];
f32[i * 4] = mesh.posa[index * 4] / 32767;
@@ -127,11 +127,11 @@ class ImportMesh {
f32[i * 4 + 2] = mesh.posa[index * 4 + 2] / 32767;
f32[i * 4 + 3] = 1.0;
- let imgmesh = image_from_bytes(f32.buffer, Config.getTextureResX(), Config.getTextureResY(), tex_format_t.RGBA128);
+ let imgmesh = image_from_bytes(f32.buffer, config_getTextureResX(), config_getTextureResY(), tex_format_t.RGBA128);
g2_set_pipeline(base_pipeCopy128);
- g2_draw_scaled_image(imgmesh, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+ g2_draw_scaled_image(imgmesh, 0, 0, config_getTextureResX(), config_getTextureResY());
@@ -148,12 +148,12 @@ class ImportMesh {
- let object = scene_add_mesh_object(md, Context.raw.paintObject.materials, Context.raw.paintObject.base);
+ let object = scene_add_mesh_object(md, context_raw.paintObject.materials, context_raw.paintObject.base);
object.base.name = mesh.base.name;
object.skip_context = "paint";
// Ensure unique names
- for (let p of Project.paintObjects) {
+ for (let p of project_paintObjects) {
if (p.base.name == object.base.name) {
p.base.name += ".001";
p.data._.handle += ".001";
@@ -161,12 +161,12 @@ class ImportMesh {
- Project.paintObjects.push(object);
+ project_paintObjects.push(object);
@@ -5,7 +5,7 @@ class MakeBrush {
- let m = Project.materials[0].data;
+ let m = project_materials[0].data;
@@ -88,7 +88,7 @@ class MakeMaterial {
@@ -96,7 +96,7 @@ class MakeMaterial {
static parseParticleMaterial = () => {
- let m = Context.raw.particleMaterial;
+ let m = context_raw.particleMaterial;
@@ -118,7 +118,7 @@ class MakeMaterial {
static parseMeshPreviewMaterial = () => {
if (!MakeMaterial.getMOut()) return;
@@ -156,7 +156,7 @@ class MakeMaterial {
let rebuild = MakeMaterial.heightUsed;
@@ -164,7 +164,7 @@ class MakeMaterial {
@@ -179,7 +179,7 @@ class MakeMaterial {
@@ -223,14 +223,14 @@ class MakeMaterial {
static bakeNodePreviews = () => {
- Context.raw.nodePreviewsUsed = [];
- if (Context.raw.nodePreviews == null) Context.raw.nodePreviews = new Map();
+ context_raw.nodePreviewsUsed = [];
+ if (context_raw.nodePreviews == null) context_raw.nodePreviews = new Map();
MakeMaterial.traverseNodes(UINodes.getCanvasMaterial().nodes, null, []);
- for (let key of Context.raw.nodePreviews.keys()) {
- if (Context.raw.nodePreviewsUsed.indexOf(key) == -1) {
- let image = Context.raw.nodePreviews.get(key);
+ for (let key of context_raw.nodePreviews.keys()) {
+ if (context_raw.nodePreviewsUsed.indexOf(key) == -1) {
+ let image = context_raw.nodePreviews.get(key);
base_notifyOnNextFrame(function() { image_unload(image); });
- Context.raw.nodePreviews.delete(key);
+ context_raw.nodePreviews.delete(key);
@@ -239,7 +239,7 @@ class MakeMaterial {
MakeMaterial.bakeNodePreview(node, group, parents);
- for (let g of Project.materialGroups) {
+ for (let g of project_materialGroups) {
MakeMaterial.traverseNodes(g.canvas.nodes, g.canvas, parents);
@@ -254,14 +254,14 @@ class MakeMaterial {
static bakeNodePreview = (node: zui_node_t, group: zui_node_canvas_t, parents: zui_node_t[]) => {
let id = ParserMaterial.node_name(node, parents);
- let image = Context.raw.nodePreviews.get(id);
- Context.raw.nodePreviewsUsed.push(id);
- let resX = Math.floor(Config.getTextureResX() / 4);
- let resY = Math.floor(Config.getTextureResY() / 4);
+ let image = context_raw.nodePreviews.get(id);
+ context_raw.nodePreviewsUsed.push(id);
+ let resX = Math.floor(config_getTextureResX() / 4);
+ let resY = Math.floor(config_getTextureResY() / 4);
- Context.raw.nodePreviews.set(id, image);
+ context_raw.nodePreviews.set(id, image);
@@ -270,14 +270,14 @@ class MakeMaterial {
- let resX = Math.floor(Config.getTextureResX());
- let resY = Math.floor(Config.getTextureResY());
+ let resX = Math.floor(config_getTextureResX());
+ let resY = Math.floor(config_getTextureResY());
@@ -303,16 +303,16 @@ class MakeMaterial {
static parseBrush = () => {
@@ -5,18 +5,18 @@ class MakeMesh {
let context_id = layerPass == 0 ? "mesh" : "mesh" + layerPass;
vertex_elements: [{name: "pos", data: "short4norm"}],
@@ -29,7 +29,7 @@ class MakeMesh {
let textureCount = 0;
- NodeShader.add_uniform(vert, 'sampler2D texpaint_vert', '_texpaint_vert' + Project.layers[0].id);
+ NodeShader.add_uniform(vert, 'sampler2D texpaint_vert', '_texpaint_vert' + project_layers[0].id);
NodeShader.write(vert, 'vec3 meshpos = texelFetch(texpaint_vert, ivec2(gl_VertexID % textureSize(texpaint_vert, 0).x, gl_VertexID / textureSize(texpaint_vert, 0).y), 0).xyz;');
// + pos.xyz * 0.000001
NodeShader.write(vert, 'gl_Position = mul(vec4(meshpos.xyz, 1.0), WVP);');
@@ -98,12 +98,12 @@ class MakeMesh {
- if (Context.raw.drawWireframe) {
+ if (context_raw.drawWireframe) {
textureCount++;
textureCount += 4;
@@ -115,7 +115,7 @@ class MakeMesh {
MakeMesh.layerPassCount = 1;
let startCount = textureCount;
if (!SlotLayer.isLayer(l) || !SlotLayer.isVisible(l)) continue;
let count = 3;
@@ -136,8 +136,8 @@ class MakeMesh {
if (SlotLayer.getObjectMask(l) > 0) {
- if (SlotLayer.getObjectMask(l) > Project.paintObjects.length) { // Atlas
- let visibles = Project.getAtlasObjects(SlotLayer.getObjectMask(l));
+ if (SlotLayer.getObjectMask(l) > project_paintObjects.length) { // Atlas
+ let visibles = project_getAtlasObjects(SlotLayer.getObjectMask(l));
for (let i = 0; i < visibles.length; ++i) {
@@ -146,7 +146,7 @@ class MakeMesh {
- let uid = Project.paintObjects[SlotLayer.getObjectMask(l) - 1].base.uid;
+ let uid = project_paintObjects[SlotLayer.getObjectMask(l) - 1].base.uid;
@@ -182,7 +182,7 @@ class MakeMesh {
NodeShader.write(frag, `texpaint_opac *= ${SlotLayer.getOpacity(l)};`);
NodeShader.write(frag, 'basecol = vec3(0.8, 0.8, 0.8);// texpaint_sample.rgb * texpaint_opac;');
@@ -190,7 +190,7 @@ class MakeMesh {
- if (lastPass && Context.raw.drawTexels) {
+ if (lastPass && context_raw.drawTexels) {
@@ -200,7 +200,7 @@ class MakeMesh {
- if (lastPass && Context.raw.drawWireframe) {
+ if (lastPass && context_raw.drawWireframe) {
@@ -236,15 +236,15 @@ class MakeMesh {
- if (Context.raw.viewportMode == ViewportMode.ViewLit) {
+ if (context_raw.viewportMode == ViewportMode.ViewLit) {
- else if (Context.raw.renderMode == RenderMode.RenderForward) {
+ else if (context_raw.renderMode == RenderMode.RenderForward) {
@@ -292,11 +292,11 @@ class MakeMesh {
- else if (Context.raw.viewportMode == ViewportMode.ViewObjectNormal) {
+ else if (context_raw.viewportMode == ViewportMode.ViewObjectNormal) {
frag.nAttr = true;
- else if (Context.raw.viewportMode == ViewportMode.ViewObjectID) {
+ else if (context_raw.viewportMode == ViewportMode.ViewObjectID) {
@@ -308,7 +308,7 @@ class MakeMesh {
@@ -5,7 +5,7 @@ class MakeMeshPreview {
let context_id = "mesh";
depth_write: true,
compare_mode: "less",
@@ -15,17 +15,17 @@ class MakeMeshPreview {
let pos = "pos";
- let skin = mesh_data_get_vertex_array(Context.raw.paintObject.data, "bone") != null;
+ let skin = mesh_data_get_vertex_array(context_raw.paintObject.data, "bone") != null;
- NodeShaderContext.add_elem(con_mesh, "bone", 'short4norm');
- NodeShaderContext.add_elem(con_mesh, "weight", 'short4norm');
+ NodeShadercontext_add_elem(con_mesh, "bone", 'short4norm');
+ NodeShadercontext_add_elem(con_mesh, "weight", 'short4norm');
NodeShader.add_function(vert, ShaderFunctions.str_getSkinningDualQuat);
NodeShader.add_uniform(vert, 'vec4 skinBones[128 * 2]', '_skin_bones');
NodeShader.add_uniform(vert, 'float posUnpack', '_pos_unpack');
- let brushScale = (Context.raw.brushScale * Context.raw.brushNodesScale) + "";
+ let brushScale = (context_raw.brushScale * context_raw.brushNodesScale) + "";
NodeShader.write_attrib(vert, `texCoord = tex * float(${brushScale});`);
- let decal = Context.raw.decalPreview;
+ let decal = context_raw.decalPreview;
ParserMaterial.sample_uv_scale = brushScale;
ParserMaterial.parse_height = MakeMaterial.heightUsed;
- if (Context.raw.tool == WorkspaceTool.ToolText) {
+ if (context_raw.tool == WorkspaceTool.ToolText) {
NodeShader.write(frag, `opacity *= textureLod(textexttool, texCoord / float(${brushScale}), 0.0).r;`);
@@ -3,7 +3,7 @@ class MakeSculpt {
let context_id = "paint";
@@ -17,14 +17,14 @@ class MakeSculpt {
- let faceFill = Context.raw.tool == WorkspaceTool.ToolFill && Context.raw.fillTypeHandle.position == FillType.FillFace;
- let decal = Context.raw.tool == WorkspaceTool.ToolDecal || Context.raw.tool == WorkspaceTool.ToolText;
+ let faceFill = context_raw.tool == WorkspaceTool.ToolFill && context_raw.fillTypeHandle.position == FillType.FillFace;
+ let decal = context_raw.tool == WorkspaceTool.ToolDecal || context_raw.tool == WorkspaceTool.ToolText;
NodeShader.write(vert, 'const vec2 madd = vec2(0.5, 0.5);');
@@ -45,15 +45,15 @@ class MakeSculpt {
- if (Context.raw.tool == WorkspaceTool.ToolBrush ||
- Context.raw.tool == WorkspaceTool.ToolEraser ||
- Context.raw.tool == WorkspaceTool.ToolSmudge ||
- Context.raw.tool == WorkspaceTool.ToolParticle ||
+ if (context_raw.tool == WorkspaceTool.ToolBrush ||
+ context_raw.tool == WorkspaceTool.ToolEraser ||
+ context_raw.tool == WorkspaceTool.ToolSmudge ||
+ context_raw.tool == WorkspaceTool.ToolParticle ||
- let depthReject = !Context.raw.xray;
+ let depthReject = !context_raw.xray;
MakeBrush.run(vert, frag);
static showContextMenu = false;
- let mini = Config.raw.layout[layout_size_t.SIDEBAR_W] <= UIBase.sidebar_mini_w;
+ let mini = config_config_raw.layout[layout_size_t.SIDEBAR_W] <= UIBase.sidebar_mini_w;
@@ -50,10 +50,10 @@ class TabLayers {
static drawSlots = (mini: bool) => {
- for (let i = 0; i < Project.layers.length; ++i) {
- let j = Project.layers.length - 1 - i;
- let l = Project.layers[j];
+ for (let i = 0; i < project_project_layers.length; ++i) {
+ if (i >= project_project_layers.length) break; // Layer was deleted
+ let j = project_project_layers.length - 1 - i;
+ let l = project_project_layers[j];
@@ -73,10 +73,10 @@ class TabLayers {
let ui = UIBase.ui;
- let l = Context.raw.layer;
+ let l = context_context_raw.layer;
base_base_new_layer();
}, 1);
@@ -86,8 +86,8 @@ class TabLayers {
let ar = [tr("All")];
let filterHandle = zui_handle("tablayers_0");
- filterHandle.position = Context.raw.layer_filter;
- Context.raw.layer_filter = zui_combo(filterHandle, ar, tr("Filter"), false, zui_align_t.LEFT);
+ filterHandle.position = context_context_raw.layer_filter;
+ context_context_raw.layer_filter = zui_combo(filterHandle, ar, tr("Filter"), false, zui_align_t.LEFT);
static remapLayerPointers = (nodes: zui_node_t[], pointerMap: Map<i32, i32>) => {
@@ -103,13 +103,13 @@ class TabLayers {
static initLayerMap = (): Map<SlotLayerRaw, i32> => {
- for (let i = 0; i < Project.layers.length; ++i) res.set(Project.layers[i], i);
+ for (let i = 0; i < project_project_layers.length; ++i) res.set(project_project_layers[i], i);
static fillLayerMap = (map: Map<SlotLayerRaw, i32>): Map<i32, i32> => {
+ for (let l of map.keys()) res.set(map.get(l), project_project_layers.indexOf(l) > -1 ? project_project_layers.indexOf(l) : 9999);
@@ -117,15 +117,15 @@ class TabLayers {
base_base_drag_off_x = offX;
base_base_drag_off_y = offY;
base_base_drag_layer = layer;
+ context_context_raw.drag_dest = project_project_layers.indexOf(layer);
static drawLayerSlot = (l: SlotLayerRaw, i: i32, mini: bool) => {
+ if (context_context_raw.layer_filter > 0 &&
+ SlotLayer.get_object_mask(l) != context_context_raw.layer_filter) {
@@ -141,37 +141,37 @@ class TabLayers {
let absy = ui._window_y + ui._y;
- if (base_base_is_dragging && base_base_drag_layer != null && Context.in_layers()) {
+ if (base_base_is_dragging && base_base_drag_layer != null && context_context_in_layers()) {
- let down = Project.layers.indexOf(base_base_drag_layer) >= i;
+ let down = project_project_layers.indexOf(base_base_drag_layer) >= i;
+ context_context_raw.drag_dest = down ? i : i - 1;
- let ls = Project.layers;
- let dest = Context.raw.drag_dest;
+ let ls = project_project_layers;
+ let dest = context_context_raw.drag_dest;
let toGroup = down ? dest > 0 && ls[dest - 1].parent != null && ls[dest - 1].parent.show_panel : dest < ls.length && ls[dest].parent != null && ls[dest].parent.show_panel;
let nestedGroup = SlotLayer.is_group(base_base_drag_layer) && toGroup;
if (!nestedGroup) {
+ if (SlotLayer.can_move(context_context_raw.layer, context_context_raw.drag_dest)) {
+ else if (i == project_project_layers.length - 1 && mouse_y < absy + step) {
+ context_context_raw.drag_dest = project_project_layers.length - 1;
- if (base_base_is_dragging && (base_base_drag_material != null || base_base_drag_swatch != null) && Context.in_layers()) {
+ if (base_base_is_dragging && (base_base_drag_material != null || base_base_drag_swatch != null) && context_context_in_layers()) {
+ context_context_raw.drag_dest = i;
+ context_context_raw.drag_dest = project_project_layers.length;
+ if (TabLayers.can_drop_new_layer(project_project_layers.length))
@@ -212,8 +212,8 @@ class TabLayers {
- let icons = Res.get("icons.k");
- let r = Res.tile18(icons, l.visible ? 0 : 1, 0);
+ let icons = resource_get("icons.k");
+ let r = resource_tile18(icons, l.visible ? 0 : 1, 0);
let center = (step / 2) * zui_SCALE(ui);
@@ -244,23 +244,23 @@ class TabLayers {
+ context_context_set_layer(l);
+ TabLayers.set_drag_layer(context_context_raw.layer, -(mouse_x - uix - ui._window_x - 3), -(mouse_y - uiy - ui._window_y + 1));
else if (ui.input_released) {
+ if (time_time() - context_context_raw.select_time > 0.2) {
+ context_context_raw.select_time = time_time();
let state = zui_text(l.name);
- let td = time_time() - Context.raw.select_time;
+ let td = time_time() - context_context_raw.select_time;
if (td < 0.2 && td > 0.0) {
@@ -270,10 +270,10 @@ class TabLayers {
// let inFocus = ui.inputX > ui._windowX && ui.inputX < ui._windowX + ui._windowW &&
// ui.inputY > ui._windowY && ui.inputY < ui._windowY + ui._windowH;
- // if (inFocus && ui.isDeleteDown && canDelete(Context.raw.layer)) {
+ // if (inFocus && ui.isDeleteDown && canDelete(context_raw.layer)) {
// ui.isDeleteDown = false;
// let _init() = () => {
- // deleteLayer(Context.raw.layer);
+ // deleteLayer(context_raw.layer);
// app_notify_on_init(_init);
@@ -321,7 +321,7 @@ class TabLayers {
+ if (config_config_raw.touch_ui) {
@@ -357,7 +357,7 @@ class TabLayers {
+ if (context_context_raw.layer == l) {
@@ -368,15 +368,15 @@ class TabLayers {
static canMergeDown = (l: SlotLayerRaw) : bool => {
- let index = Project.layers.indexOf(l);
+ let index = project_project_layers.indexOf(l);
+ if (SlotLayer.is_layer(l) && SlotLayer.is_mask(project_project_layers[0]) && project_project_layers[0].parent == l) return false;
+ if (SlotLayer.is_group(l) && SlotLayer.is_in_group(project_project_layers[0]) && SlotLayer.get_containing_group(project_project_layers[0]) == l) return false;
+ if (SlotLayer.is_mask(l) && !SlotLayer.is_mask(project_project_layers[index - 1])) return false;
@@ -385,7 +385,7 @@ class TabLayers {
static canDropNewLayer = (position: i32) => {
+ if (position > 0 && position < project_project_layers.length && SlotLayer.is_mask(project_project_layers[position - 1])) {
- Context.raw.runBrush = this.run;
- Context.raw.parseBrushInputs = this.parseInputs;
+ context_raw.runBrush = this.run;
+ context_raw.parseBrushInputs = this.parseInputs;
parseInputs = () => {
- let lastMask = Context.raw.brushMaskImage;
- let lastStencil = Context.raw.brushStencilImage;
+ let lastMask = context_raw.brushMaskImage;
+ let lastStencil = context_raw.brushStencilImage;
@@ -29,75 +29,75 @@ class BrushOutputNode extends LogicNode {
- Context.raw.paintVec = input0;
- Context.raw.brushNodesRadius = input1;
+ context_raw.paintVec = input0;
+ context_raw.brushNodesRadius = input1;
let opac: any = input2; // Float or texture name
- Context.raw.brushMaskImageIsAlpha = opac.endsWith(".a");
+ context_raw.brushMaskImageIsAlpha = opac.endsWith(".a");
- Context.raw.brushNodesOpacity = 1.0;
- let index = Project.assetNames.indexOf(opac);
- Context.raw.brushMaskImage = Project.getImage(asset);
+ context_raw.brushNodesOpacity = 1.0;
+ let index = project_assetNames.indexOf(opac);
+ context_raw.brushMaskImage = project_getImage(asset);
- Context.raw.brushNodesOpacity = opac;
- Context.raw.brushMaskImage = null;
+ context_raw.brushNodesOpacity = opac;
+ context_raw.brushMaskImage = null;
- Context.raw.brushNodesHardness = input3;
+ context_raw.brushNodesHardness = input3;
let stencil: any = input4; // Float or texture name
- Context.raw.brushStencilImageIsAlpha = stencil.endsWith(".a");
+ context_raw.brushStencilImageIsAlpha = stencil.endsWith(".a");
- let index = Project.assetNames.indexOf(stencil);
- Context.raw.brushStencilImage = Project.getImage(asset);
+ let index = project_assetNames.indexOf(stencil);
+ context_raw.brushStencilImage = project_getImage(asset);
- Context.raw.brushStencilImage = null;
+ context_raw.brushStencilImage = null;
- if (lastMask != Context.raw.brushMaskImage ||
- lastStencil != Context.raw.brushStencilImage) {
+ if (lastMask != context_raw.brushMaskImage ||
+ lastStencil != context_raw.brushStencilImage) {
- Context.raw.brushDirectional = this.Directional;
+ context_raw.brushDirectional = this.Directional;
let left = 0.0;
let right = 1.0;
- right = (Context.raw.splitView ? 2.0 : 1.0) + UIView2D.ww / base_w();
+ right = (context_raw.splitView ? 2.0 : 1.0) + UIView2D.ww / base_w();
- if (Context.raw.lastPaintX < 0 || Context.raw.lastPaintY < 0) {
- Context.raw.lastPaintVecX = Context.raw.paintVec.x;
- Context.raw.lastPaintVecY = Context.raw.paintVec.y;
+ if (context_raw.lastPaintX < 0 || context_raw.lastPaintY < 0) {
+ context_raw.lastPaintVecX = context_raw.paintVec.x;
+ context_raw.lastPaintVecY = context_raw.paintVec.y;
- let fillLayer = Context.raw.layer.fill_layer != null;
+ let fillLayer = context_raw.layer.fill_layer != null;
- let groupLayer = SlotLayer.isGroup(Context.raw.layer);
+ let groupLayer = SlotLayer.isGroup(context_raw.layer);
- if (Context.raw.paintVec.x > left &&
- Context.raw.paintVec.x < right &&
- Context.raw.paintVec.y > 0 &&
- Context.raw.paintVec.y < 1 &&
+ if (context_raw.paintVec.x > left &&
+ context_raw.paintVec.x < right &&
+ context_raw.paintVec.y > 0 &&
+ context_raw.paintVec.y < 1 &&
!fillLayer &&
!groupLayer &&
- (SlotLayer.isVisible(Context.raw.layer) || Context.raw.paint2d) &&
+ (SlotLayer.isVisible(context_raw.layer) || context_raw.paint2d) &&
!base_isDragging &&
!base_isResizing &&
@@ -107,29 +107,29 @@ class BrushOutputNode extends LogicNode {
let down = mouse_down() || pen_down();
- let sameSpot = Context.raw.paintVec.x == Context.raw.lastPaintX && Context.raw.paintVec.y == Context.raw.lastPaintY;
- let lazy = Context.raw.tool == WorkspaceTool.ToolBrush && Context.raw.brushLazyRadius > 0;
+ let sameSpot = context_raw.paintVec.x == context_raw.lastPaintX && context_raw.paintVec.y == context_raw.lastPaintY;
+ let lazy = context_raw.tool == WorkspaceTool.ToolBrush && context_raw.brushLazyRadius > 0;
if (down && (sameSpot || lazy)) {
- Context.raw.lastPaintX = Context.raw.paintVec.x;
- Context.raw.lastPaintY = Context.raw.paintVec.y;
+ context_raw.lastPaintX = context_raw.paintVec.x;
+ context_raw.lastPaintY = context_raw.paintVec.y;
- if (Context.raw.tool == WorkspaceTool.ToolParticle) {
+ if (context_raw.tool == WorkspaceTool.ToolParticle) {
this.parseInputs();
- History.pushUndo2 = true; ////
+ history_push_undo2 = true; ////
@@ -61,7 +61,7 @@ class BoxExport {
///if (is_paint || is_lab)
static tab_export_textures = (ui: zui_t, title: string, bake_material: bool = false) => {
- let tab_vertical: bool = Config.raw.touch_ui;
+ let tab_vertical: bool = config_raw.touch_ui;
if (zui_tab(BoxExport.htab, title, tab_vertical)) {
zui_row([0.5, 0.5]);
@@ -100,22 +100,22 @@ class BoxExport {
if (base_bits_handle.position == texture_bits_t.BITS8) {
- Context.raw.format_type = zui_combo(zui_handle("boxexport_0", { position: Context.raw.format_type }), ["png", "jpg"], tr("Format"), true);
+ context_raw.format_type = zui_combo(zui_handle("boxexport_0", { position: context_raw.format_type }), ["png", "jpg"], tr("Format"), true);
- Context.raw.format_type = zui_combo(zui_handle("boxexport_1", { position: Context.raw.format_type }), ["exr"], tr("Format"), true);
+ context_raw.format_type = zui_combo(zui_handle("boxexport_1", { position: context_raw.format_type }), ["exr"], tr("Format"), true);
- ui.enabled = Context.raw.format_type == texture_ldr_format_t.JPG && base_bits_handle.position == texture_bits_t.BITS8;
- Context.raw.format_quality = zui_slider(zui_handle("boxexport_2", { value: Context.raw.format_quality }), tr("Quality"), 0.0, 100.0, true, 1);
+ ui.enabled = context_raw.format_type == texture_ldr_format_t.JPG && base_bits_handle.position == texture_bits_t.BITS8;
+ context_raw.format_quality = zui_slider(zui_handle("boxexport_2", { value: context_raw.format_quality }), tr("Quality"), 0.0, 100.0, true, 1);
ui.enabled = !bake_material;
let layers_export_handle: zui_handle_t = zui_handle("boxexport_3");
- layers_export_handle.position = Context.raw.layers_export;
- Context.raw.layers_export = zui_combo(layers_export_handle, [tr("Visible"), tr("Selected"), tr("Per Object"), tr("Per Udim Tile")], tr("Layers"), true);
+ layers_export_handle.position = context_raw.layers_export;
+ context_raw.layers_export = zui_combo(layers_export_handle, [tr("Visible"), tr("Selected"), tr("Per Object"), tr("Per Udim Tile")], tr("Layers"), true);
@@ -123,8 +123,8 @@ class BoxExport {
if (BoxExport.hpreset.changed) BoxExport.preset = null;
let layers_destination_handle: zui_handle_t = zui_handle("boxexport_4");
- layers_destination_handle.position = Context.raw.layers_destination;
- Context.raw.layers_destination = zui_combo(layers_destination_handle, [tr("Disk"), tr("Packed")], tr("Destination"), true);
+ layers_destination_handle.position = context_raw.layers_destination;
+ context_raw.layers_destination = zui_combo(layers_destination_handle, [tr("Disk"), tr("Packed")], tr("Destination"), true);
@@ -134,36 +134,36 @@ class BoxExport {
if (zui_button(tr("Export"))) {
UIBox.hide();
- if (Context.raw.layers_destination == export_destination_t.PACKED) {
- Context.raw.texture_export_path = "/";
+ if (context_raw.layers_destination == export_destination_t.PACKED) {
+ context_raw.texture_export_path = "/";
- ExportTexture.run(Context.raw.texture_export_path, bake_material);
+ ExportTexture.run(context_raw.texture_export_path, bake_material);
///if is_lab
- ExportTexture.run(Context.raw.texture_export_path);
+ ExportTexture.run(context_raw.texture_export_path);
- let filters = base_bits_handle.position != texture_bits_t.BITS8 ? "exr" : Context.raw.format_type == texture_ldr_format_t.PNG ? "png" : "jpg";
+ let filters = base_bits_handle.position != texture_bits_t.BITS8 ? "exr" : context_raw.format_type == texture_ldr_format_t.PNG ? "png" : "jpg";
UIFiles.show(filters, true, false, (path: string) => {
- Context.raw.texture_export_path = path;
+ context_raw.texture_export_path = path;
let doExport = () => {
base_notify_on_next_frame(() => {
- Console.toast(tr("Exporting textures"));
+ console_toast(tr("Exporting textures"));
base_notify_on_next_frame(doExport);
@@ -172,12 +172,12 @@ class BoxExport {
- if (ui.is_hovered) zui_tooltip(tr("Export texture files") + ` (${Config.keymap.file_export_textures})`);
+ if (ui.is_hovered) zui_tooltip(tr("Export texture files") + ` (${config_keymap.file_export_textures})`);
static tab_presets = (ui: zui_t) => {
if (zui_tab(BoxExport.htab, tr("Presets"), tab_vertical)) {
zui_row([3 / 5, 1 / 5, 1 / 5]);
@@ -186,7 +186,7 @@ class BoxExport {
if (zui_button(tr("New"))) {
UIBox.show_custom((ui: zui_t) => {
if (zui_tab(zui_handle("boxexport_5"), tr("New Preset"), tab_vertical)) {
let preset_name: string = zui_text_input(zui_handle("boxexport_6", { text: "new_preset" }), tr("Name"));
@@ -207,15 +207,15 @@ class BoxExport {
UIFiles.show("json", false, false, (path: string) => {
path = path.toLowerCase();
if (path.endsWith(".json")) {
- let filename: string = path.substr(path.lastIndexOf(Path.sep) + 1);
- let dst_path: string = Path.data() + Path.sep + "export_presets" + Path.sep + filename;
- File.copy(path, dst_path); // Copy to presets folder
+ let filename: string = path.substr(path.lastIndexOf(path_sep) + 1);
+ let dst_path: string = path_data() + path_sep + "export_presets" + path_sep + filename;
+ file_copy(path, dst_path); // Copy to presets folder
BoxExport.fetch_presets();
BoxExport.preset = null;
BoxExport.hpreset.position = BoxExport.files.indexOf(filename.substr(0, filename.length - 5)); // Strip .json
- Console.info(tr("Preset imported:") + " " + filename);
+ console_info(tr("Preset imported:") + " " + filename);
- else Console.error(Strings.error1());
+ else console_error(strings_error1());
@@ -290,29 +290,29 @@ class BoxExport {
static tab_atlases = (ui: zui_t) => {
if (zui_tab(BoxExport.htab, tr("Atlases"), tab_vertical)) {
- if (Project.atlas_objects == null || Project.atlas_objects.length != Project.paint_objects.length) {
- Project.atlas_objects = [];
- Project.atlas_names = [];
- Project.atlas_objects.push(0);
- Project.atlas_names.push(tr("Atlas") + " " + (i + 1));
+ if (project_atlas_objects == null || project_atlas_objects.length != project_paint_objects.length) {
+ project_atlas_objects = [];
+ project_atlas_names = [];
+ project_atlas_objects.push(0);
+ project_atlas_names.push(tr("Atlas") + " " + (i + 1));
zui_row([1 / 2, 1 / 2]);
- zui_text(Project.paint_objects[i].base.name);
+ zui_text(project_paint_objects[i].base.name);
let hatlas: zui_handle_t = zui_nest(zui_handle("boxexport_7"), i);
- hatlas.position = Project.atlas_objects[i];
- Project.atlas_objects[i] = zui_combo(hatlas, Project.atlas_names, tr("Atlas"));
+ hatlas.position = project_atlas_objects[i];
+ project_atlas_objects[i] = zui_combo(hatlas, project_atlas_names, tr("Atlas"));
static show_mesh = () => {
- BoxExport.export_mesh_handle.position = Context.raw.export_mesh_index;
+ BoxExport.export_mesh_handle.position = context_raw.export_mesh_index;
let htab: zui_handle_t = zui_handle("boxexport_8");
BoxExport.tab_export_mesh(ui, htab);
@@ -320,22 +320,22 @@ class BoxExport {
static tab_export_mesh = (ui: zui_t, htab: zui_handle_t) => {
if (zui_tab(htab, tr("Export Mesh"), tab_vertical)) {
- Context.raw.export_mesh_format = zui_combo(zui_handle("boxexport_9", { position: Context.raw.export_mesh_format }), ["obj", "arm"], tr("Format"), true);
+ context_raw.export_mesh_format = zui_combo(zui_handle("boxexport_9", { position: context_raw.export_mesh_format }), ["obj", "arm"], tr("Format"), true);
zui_combo(BoxExport.export_mesh_handle, ar, tr("Meshes"), true);
let apply_displacement: bool = zui_check(zui_handle("boxexport_10"), tr("Apply Displacement"));
let tris: i32 = 0;
let pos: i32 = BoxExport.export_mesh_handle.position;
- let paint_objects: mesh_object_t[] = pos == 0 ? Project.paint_objects : [Project.paint_objects[pos - 1]];
+ let paint_objects: mesh_object_t[] = pos == 0 ? project_paint_objects : [project_paint_objects[pos - 1]];
for (let po of paint_objects) {
for (let inda of po.data.index_arrays) {
tris += Math.floor(inda.values.length / 3);
@@ -349,7 +349,7 @@ class BoxExport {
- UIFiles.show(Context.raw.export_mesh_format == mesh_format_t.OBJ ? "obj" : "arm", true, false, (path: string) => {
+ UIFiles.show(context_raw.export_mesh_format == mesh_format_t.OBJ ? "obj" : "arm", true, false, (path: string) => {
let f: string = sys_title();
@@ -357,11 +357,11 @@ class BoxExport {
- ExportMesh.run(path + Path.sep + f, BoxExport.export_mesh_handle.position == 0 ? null : [Project.paint_objects[BoxExport.export_mesh_handle.position - 1]], apply_displacement);
+ ExportMesh.run(path + path_sep + f, BoxExport.export_mesh_handle.position == 0 ? null : [project_paint_objects[BoxExport.export_mesh_handle.position - 1]], apply_displacement);
- Console.toast(tr("Exporting mesh"));
+ console_toast(tr("Exporting mesh"));
@@ -376,14 +376,14 @@ class BoxExport {
static show_material = () => {
let htab: zui_handle_t = zui_handle("boxexport_11");
if (zui_tab(htab, tr("Export Material"), tab_vertical)) {
let h1: zui_handle_t = zui_handle("boxexport_12");
let h2: zui_handle_t = zui_handle("boxexport_13");
- h1.selected = Context.raw.pack_assets_on_export;
- h2.selected = Context.raw.write_icon_on_export;
- Context.raw.pack_assets_on_export = zui_check(h1, tr("Pack Assets"));
- Context.raw.write_icon_on_export = zui_check(h2, tr("Export Icon"));
+ h1.selected = context_raw.pack_assets_on_export;
+ h2.selected = context_raw.write_icon_on_export;
+ context_raw.pack_assets_on_export = zui_check(h1, tr("Pack Assets"));
+ context_raw.write_icon_on_export = zui_check(h2, tr("Export Icon"));
if (zui_button(tr("Cancel"))) {
@@ -394,7 +394,7 @@ class BoxExport {
- ExportArm.run_material(path + Path.sep + f);
+ ExportArm.run_material(path + path_sep + f);
@@ -405,14 +405,14 @@ class BoxExport {
static show_brush = () => {
let htab: zui_handle_t = zui_handle("boxexport_14");
if (zui_tab(htab, tr("Export Brush"), tab_vertical)) {
let h1: zui_handle_t = zui_handle("boxexport_15");
let h2: zui_handle_t = zui_handle("boxexport_16");
@@ -423,7 +423,7 @@ class BoxExport {
- ExportArm.run_brush(path + Path.sep + f);
+ ExportArm.run_brush(path + path_sep + f);
@@ -434,7 +434,7 @@ class BoxExport {
static fetch_presets = () => {
- BoxExport.files = File.read_directory(Path.data() + Path.sep + "export_presets");
+ BoxExport.files = file_read_directory(path_data() + path_sep + "export_presets");
for (let i: i32 = 0; i < BoxExport.files.length; ++i) {
BoxExport.files[i] = BoxExport.files[i].substr(0, BoxExport.files[i].length - 5); // Strip .json
@@ -456,14 +456,14 @@ class BoxExport {
`;
if (!name.endsWith(".json")) name += ".json";
- let path: string = Path.data() + Path.sep + "export_presets" + Path.sep + name;
+ let path: string = path_data() + path_sep + "export_presets" + path_sep + name;
krom_file_save_bytes(path, sys_string_to_buffer(template));
static save_preset = () => {
let name: string = BoxExport.files[BoxExport.hpreset.position];
if (name == "generic") return; // generic is const
- let path: string = Path.data() + Path.sep + "export_presets" + Path.sep + name + ".json";
+ let path: string = path_data() + path_sep + "export_presets" + path_sep + name + ".json";
krom_file_save_bytes(path, sys_string_to_buffer(JSON.stringify(BoxExport.preset)));
@@ -16,68 +16,68 @@ class BoxPreferences {
if (zui_tab(BoxPreferences.htab, tr("Interface"), true)) {
if (BoxPreferences.locales == null) {
- BoxPreferences.locales = Translator.get_supported_locales();
+ BoxPreferences.locales = translator_get_supported_locales();
- let locale_handle: zui_handle_t = zui_handle("boxpreferences_0", { position: BoxPreferences.locales.indexOf(Config.raw.locale) });
+ let locale_handle: zui_handle_t = zui_handle("boxpreferences_0", { position: BoxPreferences.locales.indexOf(config_raw.locale) });
zui_combo(locale_handle, BoxPreferences.locales, tr("Language"), true);
if (locale_handle.changed) {
let locale_code: string = BoxPreferences.locales[locale_handle.position];
- Config.raw.locale = locale_code;
- Translator.load_translations(locale_code);
+ config_raw.locale = locale_code;
+ translator_load_translations(locale_code);
UIBase.tag_ui_redraw();
- let hscale: zui_handle_t = zui_handle("boxpreferences_1", { value: Config.raw.window_scale });
+ let hscale: zui_handle_t = zui_handle("boxpreferences_1", { value: config_raw.window_scale });
zui_slider(hscale, tr("UI Scale"), 1.0, 4.0, true, 10);
- if (Context.raw.hscale_was_changed && !ui.input_down) {
- Context.raw.hscale_was_changed = false;
+ if (context_raw.hscale_was_changed && !ui.input_down) {
+ context_raw.hscale_was_changed = false;
if (hscale.value == null || isNaN(hscale.value)) hscale.value = 1.0;
- Config.raw.window_scale = hscale.value;
+ config_raw.window_scale = hscale.value;
BoxPreferences.set_scale();
- if (hscale.changed) Context.raw.hscale_was_changed = true;
+ if (hscale.changed) context_raw.hscale_was_changed = true;
- let hspeed: zui_handle_t = zui_handle("boxpreferences_2", { value: Config.raw.camera_zoom_speed });
- Config.raw.camera_zoom_speed = zui_slider(hspeed, tr("Camera Zoom Speed"), 0.1, 4.0, true);
+ let hspeed: zui_handle_t = zui_handle("boxpreferences_2", { value: config_raw.camera_zoom_speed });
+ config_raw.camera_zoom_speed = zui_slider(hspeed, tr("Camera Zoom Speed"), 0.1, 4.0, true);
- hspeed = zui_handle("boxpreferences_3", { value: Config.raw.camera_rotation_speed });
- Config.raw.camera_rotation_speed = zui_slider(hspeed, tr("Camera Rotation Speed"), 0.1, 4.0, true);
+ hspeed = zui_handle("boxpreferences_3", { value: config_raw.camera_rotation_speed });
+ config_raw.camera_rotation_speed = zui_slider(hspeed, tr("Camera Rotation Speed"), 0.1, 4.0, true);
- hspeed = zui_handle("boxpreferences_4", { value: Config.raw.camera_pan_speed });
- Config.raw.camera_pan_speed = zui_slider(hspeed, tr("Camera Pan Speed"), 0.1, 4.0, true);
+ hspeed = zui_handle("boxpreferences_4", { value: config_raw.camera_pan_speed });
+ config_raw.camera_pan_speed = zui_slider(hspeed, tr("Camera Pan Speed"), 0.1, 4.0, true);
- let zoom_direction_handle: zui_handle_t = zui_handle("boxpreferences_5", { position: Config.raw.zoom_direction });
+ let zoom_direction_handle: zui_handle_t = zui_handle("boxpreferences_5", { position: config_raw.zoom_direction });
zui_combo(zoom_direction_handle, [tr("Vertical"), tr("Vertical Inverted"), tr("Horizontal"), tr("Horizontal Inverted"), tr("Vertical and Horizontal"), tr("Vertical and Horizontal Inverted")], tr("Direction to Zoom"), true);
if (zoom_direction_handle.changed) {
- Config.raw.zoom_direction = zoom_direction_handle.position;
+ config_raw.zoom_direction = zoom_direction_handle.position;
- Config.raw.wrap_mouse = zui_check(zui_handle("boxpreferences_6", { selected: Config.raw.wrap_mouse }), tr("Wrap Mouse"));
+ config_raw.wrap_mouse = zui_check(zui_handle("boxpreferences_6", { selected: config_raw.wrap_mouse }), tr("Wrap Mouse"));
if (ui.is_hovered) zui_tooltip(tr("Wrap mouse around view boundaries during camera control"));
- Config.raw.node_preview = zui_check(zui_handle("boxpreferences_7", { selected: Config.raw.node_preview }), tr("Show Node Preview"));
+ config_raw.node_preview = zui_check(zui_handle("boxpreferences_7", { selected: config_raw.node_preview }), tr("Show Node Preview"));
ui.changed = false;
- Config.raw.show_asset_names = zui_check(zui_handle("boxpreferences_8", { selected: Config.raw.show_asset_names }), tr("Show Asset Names"));
+ config_raw.show_asset_names = zui_check(zui_handle("boxpreferences_8", { selected: config_raw.show_asset_names }), tr("Show Asset Names"));
if (ui.changed) {
///if !(krom_android || krom_ios)
- Config.raw.touch_ui = zui_check(zui_handle("boxpreferences_9", { selected: Config.raw.touch_ui }), tr("Touch UI"));
+ config_raw.touch_ui = zui_check(zui_handle("boxpreferences_9", { selected: config_raw.touch_ui }), tr("Touch UI"));
- zui_set_touch_scroll(Config.raw.touch_ui);
- zui_set_touch_hold(Config.raw.touch_ui);
- zui_set_touch_tooltip(Config.raw.touch_ui);
- Config.load_theme(Config.raw.theme);
+ zui_set_touch_scroll(config_raw.touch_ui);
+ zui_set_touch_hold(config_raw.touch_ui);
+ zui_set_touch_tooltip(config_raw.touch_ui);
+ config_load_theme(config_raw.theme);
- Config.raw.splash_screen = zui_check(zui_handle("boxpreferences_10", { selected: Config.raw.splash_screen }), tr("Splash Screen"));
+ config_raw.splash_screen = zui_check(zui_handle("boxpreferences_10", { selected: config_raw.splash_screen }), tr("Splash Screen"));
// Zui.text("Node Editor");
// let grid_snap: bool = Zui.check(Zui.handle("boxpreferences_11", { selected: false }), "Grid Snap");
@@ -89,9 +89,9 @@ class BoxPreferences {
if (UIMenu.menu_button(ui, tr("Confirm"))) {
ui.t.ELEMENT_H = base_default_element_h;
- Config.restore();
+ config_restore();
- if (BoxPreferences.files_plugin != null) for (let f of BoxPreferences.files_plugin) Plugin.stop(f);
+ if (BoxPreferences.files_plugin != null) for (let f of BoxPreferences.files_plugin) plugin_stop(f);
BoxPreferences.files_plugin = null;
BoxPreferences.files_keymap = null;
@@ -104,7 +104,7 @@ class BoxPreferences {
let raw: config_t = JSON.parse(sys_buffer_to_string(b));
- Config.import_from(raw);
+ config_import_from(raw);
@@ -117,7 +117,7 @@ class BoxPreferences {
base_init_layout();
- Config.save();
+ config_save();
@@ -135,8 +135,8 @@ class BoxPreferences {
zui_combo(BoxPreferences.theme_handle, BoxPreferences.themes, tr("Theme"));
if (BoxPreferences.theme_handle.changed) {
- Config.raw.theme = BoxPreferences.themes[BoxPreferences.theme_handle.position] + ".json";
+ config_raw.theme = BoxPreferences.themes[BoxPreferences.theme_handle.position] + ".json";
@@ -147,10 +147,10 @@ class BoxPreferences {
if (zui_button(tr("OK")) || ui.is_return_down) {
let template: string = JSON.stringify(base_theme);
if (!theme_name.endsWith(".json")) theme_name += ".json";
- let path: string = Path.data() + Path.sep + "themes" + Path.sep + theme_name;
+ let path: string = path_data() + path_sep + "themes" + path_sep + theme_name;
BoxPreferences.fetch_themes(); // Refresh file list
- Config.raw.theme = theme_name;
+ config_raw.theme = theme_name;
BoxPreferences.theme_handle.position = BoxPreferences.get_theme_index();
BoxPreferences.htab.position = 1; // Themes
@@ -168,7 +168,7 @@ class BoxPreferences {
UIFiles.show("json", true, false, (path: string) => {
- path += Path.sep + UIFiles.filename;
+ path += path_sep + UIFiles.filename;
if (!path.endsWith(".json")) path += ".json";
krom_file_save_bytes(path, sys_string_to_buffer(JSON.stringify(base_theme)));
@@ -204,10 +204,10 @@ class BoxPreferences {
b[1] = color_get_gb(BoxPreferences.world_color);
b[2] = color_get_bb(BoxPreferences.world_color);
b[3] = 255;
- Context.raw.empty_envmap = image_from_bytes(b.buffer, 1, 1);
- if (!Context.raw.show_envmap) {
- scene_world._.envmap = Context.raw.empty_envmap;
+ context_raw.empty_envmap = image_from_bytes(b.buffer, 1, 1);
+ if (!context_raw.show_envmap) {
+ scene_world._.envmap = context_raw.empty_envmap;
@@ -264,56 +264,56 @@ class BoxPreferences {
if (zui_tab(BoxPreferences.htab, tr("Usage"), true)) {
- Context.raw.undo_handle = zui_handle("boxpreferences_16", { value: Config.raw.undo_steps });
- Config.raw.undo_steps = Math.floor(zui_slider(Context.raw.undo_handle, tr("Undo Steps"), 1, 64, false, 1));
- if (Config.raw.undo_steps < 1) {
- Config.raw.undo_steps = Math.floor(Context.raw.undo_handle.value = 1);
+ context_raw.undo_handle = zui_handle("boxpreferences_16", { value: config_raw.undo_steps });
+ config_raw.undo_steps = Math.floor(zui_slider(context_raw.undo_handle, tr("Undo Steps"), 1, 64, false, 1));
+ if (config_raw.undo_steps < 1) {
+ config_raw.undo_steps = Math.floor(context_raw.undo_handle.value = 1);
- if (Context.raw.undo_handle.changed) {
+ if (context_raw.undo_handle.changed) {
let current: image_t = _g2_current;
///if (is_paint || is_sculpt)
- while (History.undo_layers.length < Config.raw.undo_steps) {
- let l: SlotLayerRaw = SlotLayer.create("_undo" + History.undo_layers.length);
- History.undo_layers.push(l);
+ while (history_undo_layers.length < config_raw.undo_steps) {
+ let l: SlotLayerRaw = SlotLayer.create("_undo" + history_undo_layers.length);
+ history_undo_layers.push(l);
- while (History.undo_layers.length > Config.raw.undo_steps) {
- let l: SlotLayerRaw = History.undo_layers.pop();
+ while (history_undo_layers.length > config_raw.undo_steps) {
+ let l: SlotLayerRaw = history_undo_layers.pop();
g2_begin(current);
- Config.raw.dilate_radius = Math.floor(zui_slider(zui_handle("boxpreferences_17", { value: Config.raw.dilate_radius }), tr("Dilate Radius"), 0.0, 16.0, true, 1));
+ config_raw.dilate_radius = Math.floor(zui_slider(zui_handle("boxpreferences_17", { value: config_raw.dilate_radius }), tr("Dilate Radius"), 0.0, 16.0, true, 1));
if (ui.is_hovered) zui_tooltip(tr("Dilate painted textures to prevent seams"));
- let dilate_handle: zui_handle_t = zui_handle("boxpreferences_18", { position: Config.raw.dilate });
+ let dilate_handle: zui_handle_t = zui_handle("boxpreferences_18", { position: config_raw.dilate });
zui_combo(dilate_handle, [tr("Instant"), tr("Delayed")], tr("Dilate"), true);
if (dilate_handle.changed) {
- Config.raw.dilate = dilate_handle.position;
+ config_raw.dilate = dilate_handle.position;
- let workspace_handle: zui_handle_t = zui_handle("boxpreferences_19", { position: Config.raw.workspace });
+ let workspace_handle: zui_handle_t = zui_handle("boxpreferences_19", { position: config_raw.workspace });
zui_combo(workspace_handle, [tr("3D View"), tr("2D View")], tr("Default Workspace"), true);
if (workspace_handle.changed) {
- Config.raw.workspace = workspace_handle.position;
+ config_raw.workspace = workspace_handle.position;
- let camera_controls_handle: zui_handle_t = zui_handle("boxpreferences_20", { position: Config.raw.camera_controls });
+ let camera_controls_handle: zui_handle_t = zui_handle("boxpreferences_20", { position: config_raw.camera_controls });
zui_combo(camera_controls_handle, [tr("Orbit"), tr("Rotate"), tr("Fly")], tr("Default Camera Controls"), true);
if (camera_controls_handle.changed) {
- Config.raw.camera_controls = camera_controls_handle.position;
+ config_raw.camera_controls = camera_controls_handle.position;
- let layer_res_handle: zui_handle_t = zui_handle("boxpreferences_21", { position: Config.raw.layer_res });
+ let layer_res_handle: zui_handle_t = zui_handle("boxpreferences_21", { position: config_raw.layer_res });
@@ -332,40 +332,40 @@ class BoxPreferences {
if (layer_res_handle.changed) {
- Config.raw.layer_res = layer_res_handle.position;
+ config_raw.layer_res = layer_res_handle.position;
- let server_handle: zui_handle_t = zui_handle("boxpreferences_22", { text: Config.raw.server });
- Config.raw.server = zui_text_input(server_handle, tr("Cloud Server"));
+ let server_handle: zui_handle_t = zui_handle("boxpreferences_22", { text: config_raw.server });
+ config_raw.server = zui_text_input(server_handle, tr("Cloud Server"));
- let material_live_handle: zui_handle_t = zui_handle("boxpreferences_23", {selected: Config.raw.material_live });
- Config.raw.material_live = zui_check(material_live_handle, tr("Live Material Preview"));
+ let material_live_handle: zui_handle_t = zui_handle("boxpreferences_23", {selected: config_raw.material_live });
+ config_raw.material_live = zui_check(material_live_handle, tr("Live Material Preview"));
if (ui.is_hovered) zui_tooltip(tr("Instantly update material preview on node change"));
- let brush_live_handle: zui_handle_t = zui_handle("boxpreferences_24", { selected: Config.raw.brush_live });
- Config.raw.brush_live = zui_check(brush_live_handle, tr("Live Brush Preview"));
+ let brush_live_handle: zui_handle_t = zui_handle("boxpreferences_24", { selected: config_raw.brush_live });
+ config_raw.brush_live = zui_check(brush_live_handle, tr("Live Brush Preview"));
if (ui.is_hovered) zui_tooltip(tr("Draw live brush preview in viewport"));
- if (brush_live_handle.changed) Context.raw.ddirty = 2;
+ if (brush_live_handle.changed) context_raw.ddirty = 2;
- let brush_3d_handle: zui_handle_t = zui_handle("boxpreferences_25", { selected: Config.raw.brush_3d });
- Config.raw.brush_3d = zui_check(brush_3d_handle, tr("3D Cursor"));
+ let brush_3d_handle: zui_handle_t = zui_handle("boxpreferences_25", { selected: config_raw.brush_3d });
+ config_raw.brush_3d = zui_check(brush_3d_handle, tr("3D Cursor"));
if (brush_3d_handle.changed) MakeMaterial.parse_paint_material();
- ui.enabled = Config.raw.brush_3d;
- let brush_depth_reject_handle: zui_handle_t = zui_handle("boxpreferences_26", { selected: Config.raw.brush_depth_reject });
- Config.raw.brush_depth_reject = zui_check(brush_depth_reject_handle, tr("Depth Reject"));
+ ui.enabled = config_raw.brush_3d;
+ let brush_depth_reject_handle: zui_handle_t = zui_handle("boxpreferences_26", { selected: config_raw.brush_depth_reject });
+ config_raw.brush_depth_reject = zui_check(brush_depth_reject_handle, tr("Depth Reject"));
if (brush_depth_reject_handle.changed) MakeMaterial.parse_paint_material();
- let brush_angle_reject_handle: zui_handle_t = zui_handle("boxpreferences_27", { selected: Config.raw.brush_angle_reject });
- Config.raw.brush_angle_reject = zui_check(brush_angle_reject_handle, tr("Angle Reject"));
+ let brush_angle_reject_handle: zui_handle_t = zui_handle("boxpreferences_27", { selected: config_raw.brush_angle_reject });
+ config_raw.brush_angle_reject = zui_check(brush_angle_reject_handle, tr("Angle Reject"));
if (brush_angle_reject_handle.changed) MakeMaterial.parse_paint_material();
- if (!Config.raw.brush_angle_reject) ui.enabled = false;
- let angle_dot_handle: zui_handle_t = zui_handle("boxpreferences_28", { value: Context.raw.brush_angle_reject_dot });
- Context.raw.brush_angle_reject_dot = zui_slider(angle_dot_handle, tr("Angle"), 0.0, 1.0, true);
+ if (!config_raw.brush_angle_reject) ui.enabled = false;
+ let angle_dot_handle: zui_handle_t = zui_handle("boxpreferences_28", { value: context_raw.brush_angle_reject_dot });
+ context_raw.brush_angle_reject_dot = zui_slider(angle_dot_handle, tr("Angle"), 0.0, 1.0, true);
if (angle_dot_handle.changed) {
@@ -373,7 +373,7 @@ class BoxPreferences {
- Config.raw.gpu_inference = zui_check(zui_handle("boxpreferences_29", { selected: Config.raw.gpu_inference }), tr("Use GPU"));
+ config_raw.gpu_inference = zui_check(zui_handle("boxpreferences_29", { selected: config_raw.gpu_inference }), tr("Use GPU"));
if (ui.is_hovered) zui_tooltip(tr("Use GPU to accelerate node graph processing"));
@@ -387,88 +387,88 @@ class BoxPreferences {
if (zui_tab(BoxPreferences.htab, pen_name, true)) {
zui_text(tr("Pressure controls"));
- Config.raw.pressure_radius = zui_check(zui_handle("boxpreferences_30", { selected: Config.raw.pressure_radius }), tr("Brush Radius"));
- Config.raw.pressure_sensitivity = zui_slider(zui_handle("boxpreferences_31", { value: Config.raw.pressure_sensitivity }), tr("Sensitivity"), 0.0, 10.0, true);
+ config_raw.pressure_radius = zui_check(zui_handle("boxpreferences_30", { selected: config_raw.pressure_radius }), tr("Brush Radius"));
+ config_raw.pressure_sensitivity = zui_slider(zui_handle("boxpreferences_31", { value: config_raw.pressure_sensitivity }), tr("Sensitivity"), 0.0, 10.0, true);
- Config.raw.pressure_hardness = zui_check(zui_handle("boxpreferences_32", { selected: Config.raw.pressure_hardness }), tr("Brush Hardness"));
- Config.raw.pressure_opacity = zui_check(zui_handle("boxpreferences_33", { selected: Config.raw.pressure_opacity }), tr("Brush Opacity"));
- Config.raw.pressure_angle = zui_check(zui_handle("boxpreferences_34", { selected: Config.raw.pressure_angle }), tr("Brush Angle"));
+ config_raw.pressure_hardness = zui_check(zui_handle("boxpreferences_32", { selected: config_raw.pressure_hardness }), tr("Brush Hardness"));
+ config_raw.pressure_opacity = zui_check(zui_handle("boxpreferences_33", { selected: config_raw.pressure_opacity }), tr("Brush Opacity"));
+ config_raw.pressure_angle = zui_check(zui_handle("boxpreferences_34", { selected: config_raw.pressure_angle }), tr("Brush Angle"));
zui_row([0.5]);
if (zui_button(tr("Help"))) {
- File.load_url("https://github.com/armory3d/armorpaint_docs///pen");
+ file_load_url("https://github.com/armory3d/armorpaint_docs///pen");
- File.load_url("https://github.com/armory3d/armorlab_docs///pen");
+ file_load_url("https://github.com/armory3d/armorlab_docs///pen");
- Context.raw.hssao = zui_handle("boxpreferences_35", { selected: Config.raw.rp_ssao });
- Context.raw.hssr = zui_handle("boxpreferences_36", { selected: Config.raw.rp_ssr });
- Context.raw.hbloom = zui_handle("boxpreferences_37", { selected: Config.raw.rp_bloom });
- Context.raw.hsupersample = zui_handle("boxpreferences_38", { position: Config.get_super_sample_quality(Config.raw.rp_supersample) });
- Context.raw.hvxao = zui_handle("boxpreferences_39", { selected: Config.raw.rp_gi });
+ context_raw.hssao = zui_handle("boxpreferences_35", { selected: config_raw.rp_ssao });
+ context_raw.hssr = zui_handle("boxpreferences_36", { selected: config_raw.rp_ssr });
+ context_raw.hbloom = zui_handle("boxpreferences_37", { selected: config_raw.rp_bloom });
+ context_raw.hsupersample = zui_handle("boxpreferences_38", { position: config_get_super_sample_quality(config_raw.rp_supersample) });
+ context_raw.hvxao = zui_handle("boxpreferences_39", { selected: config_raw.rp_gi });
if (zui_tab(BoxPreferences.htab, tr("Viewport"), true)) {
- let hpathtrace_mode: zui_handle_t = zui_handle("boxpreferences_40", { position: Context.raw.pathtrace_mode });
- Context.raw.pathtrace_mode = zui_combo(hpathtrace_mode, [tr("Core"), tr("Full")], tr("Path Tracer"), true);
+ let hpathtrace_mode: zui_handle_t = zui_handle("boxpreferences_40", { position: context_raw.pathtrace_mode });
+ context_raw.pathtrace_mode = zui_combo(hpathtrace_mode, [tr("Core"), tr("Full")], tr("Path Tracer"), true);
if (hpathtrace_mode.changed) {
- let hrender_mode: zui_handle_t = zui_handle("boxpreferences_41", { position: Context.raw.render_mode });
- Context.raw.render_mode = zui_combo(hrender_mode, [tr("Full"), tr("Mobile")], tr("Renderer"), true);
+ let hrender_mode: zui_handle_t = zui_handle("boxpreferences_41", { position: context_raw.render_mode });
+ context_raw.render_mode = zui_combo(hrender_mode, [tr("Full"), tr("Mobile")], tr("Renderer"), true);
if (hrender_mode.changed) {
- Context.set_render_path();
+ context_set_render_path();
- zui_combo(Context.raw.hsupersample, ["0.25x", "0.5x", "1.0x", "1.5x", "2.0x", "4.0x"], tr("Super Sample"), true);
- if (Context.raw.hsupersample.changed) Config.apply_config();
+ zui_combo(context_raw.hsupersample, ["0.25x", "0.5x", "1.0x", "1.5x", "2.0x", "4.0x"], tr("Super Sample"), true);
+ if (context_raw.hsupersample.changed) config_apply();
- if (Context.raw.render_mode == render_mode_t.DEFERRED) {
+ if (context_raw.render_mode == render_mode_t.DEFERRED) {
- zui_check(Context.raw.hvxao, tr("Voxel AO"));
+ zui_check(context_raw.hvxao, tr("Voxel AO"));
if (ui.is_hovered) zui_tooltip(tr("Cone-traced AO and shadows"));
- if (Context.raw.hvxao.changed) {
- Config.apply_config();
+ if (context_raw.hvxao.changed) {
+ config_apply();
- ui.enabled = Context.raw.hvxao.selected;
- let h: zui_handle_t = zui_handle("boxpreferences_42", { value: Context.raw.vxao_offset });
- Context.raw.vxao_offset = zui_slider(h, tr("Cone Offset"), 1.0, 4.0, true);
- if (h.changed) Context.raw.ddirty = 2;
- h = zui_handle("boxpreferences_43", { value: Context.raw.vxao_aperture });
- Context.raw.vxao_aperture = zui_slider(h, tr("Aperture"), 1.0, 4.0, true);
+ ui.enabled = context_raw.hvxao.selected;
+ let h: zui_handle_t = zui_handle("boxpreferences_42", { value: context_raw.vxao_offset });
+ context_raw.vxao_offset = zui_slider(h, tr("Cone Offset"), 1.0, 4.0, true);
+ if (h.changed) context_raw.ddirty = 2;
+ h = zui_handle("boxpreferences_43", { value: context_raw.vxao_aperture });
+ context_raw.vxao_aperture = zui_slider(h, tr("Aperture"), 1.0, 4.0, true);
- zui_check(Context.raw.hssao, tr("SSAO"));
- if (Context.raw.hssao.changed) Config.apply_config();
- zui_check(Context.raw.hssr, tr("SSR"));
- if (Context.raw.hssr.changed) Config.apply_config();
- zui_check(Context.raw.hbloom, tr("Bloom"));
- if (Context.raw.hbloom.changed) Config.apply_config();
+ zui_check(context_raw.hssao, tr("SSAO"));
+ if (context_raw.hssao.changed) config_apply();
+ zui_check(context_raw.hssr, tr("SSR"));
+ if (context_raw.hssr.changed) config_apply();
+ zui_check(context_raw.hbloom, tr("Bloom"));
+ if (context_raw.hbloom.changed) config_apply();
- let h: zui_handle_t = zui_handle("boxpreferences_44", { value: Config.raw.rp_vignette });
- Config.raw.rp_vignette = zui_slider(h, tr("Vignette"), 0.0, 1.0, true);
+ let h: zui_handle_t = zui_handle("boxpreferences_44", { value: config_raw.rp_vignette });
+ config_raw.rp_vignette = zui_slider(h, tr("Vignette"), 0.0, 1.0, true);
- h = zui_handle("boxpreferences_45", { value: Config.raw.rp_grain });
- Config.raw.rp_grain = zui_slider(h, tr("Noise Grain"), 0.0, 1.0, true);
+ h = zui_handle("boxpreferences_45", { value: config_raw.rp_grain });
+ config_raw.rp_grain = zui_slider(h, tr("Noise Grain"), 0.0, 1.0, true);
- // let h: zui_handle_t = Zui.handle("boxpreferences_46", { value: Context.raw.autoExposureStrength });
- // Context.raw.autoExposureStrength = Zui.slider(h, "Auto Exposure", 0.0, 2.0, true);
- // if (h.changed) Context.raw.ddirty = 2;
+ // let h: zui_handle_t = Zui.handle("boxpreferences_46", { value: raw.autoExposureStrength });
+ // raw.autoExposureStrength = Zui.slider(h, "Auto Exposure", 0.0, 2.0, true);
+ // if (h.changed) raw.ddirty = 2;
let cam_raw: camera_data_t = cam.data;
@@ -482,10 +482,10 @@ class BoxPreferences {
camera_object_build_proj(cam);
- let disp_handle: zui_handle_t = zui_handle("boxpreferences_49", { value: Config.raw.displace_strength });
- Config.raw.displace_strength = zui_slider(disp_handle, tr("Displacement Strength"), 0.0, 10.0, true);
+ let disp_handle: zui_handle_t = zui_handle("boxpreferences_49", { value: config_raw.displace_strength });
+ config_raw.displace_strength = zui_slider(disp_handle, tr("Displacement Strength"), 0.0, 10.0, true);
if (disp_handle.changed) {
@@ -501,9 +501,9 @@ class BoxPreferences {
BoxPreferences.preset_handle = zui_handle("boxpreferences_50", { position: BoxPreferences.get_preset_index() });
zui_combo(BoxPreferences.preset_handle, BoxPreferences.files_keymap, tr("Preset"));
if (BoxPreferences.preset_handle.changed) {
- Config.raw.keymap = BoxPreferences.files_keymap[BoxPreferences.preset_handle.position] + ".json";
- Config.load_keymap();
+ config_raw.keymap = BoxPreferences.files_keymap[BoxPreferences.preset_handle.position] + ".json";
+ config_load_keymap();
@@ -514,10 +514,10 @@ class BoxPreferences {
let template: string = JSON.stringify(base_default_keymap);
if (!keymap_name.endsWith(".json")) keymap_name += ".json";
- let path: string = Path.data() + Path.sep + "keymap_presets" + Path.sep + keymap_name;
+ let path: string = path_data() + path_sep + "keymap_presets" + path_sep + keymap_name;
BoxPreferences.fetch_keymaps(); // Refresh file list
- Config.raw.keymap = keymap_name;
+ config_raw.keymap = keymap_name;
BoxPreferences.preset_handle.position = BoxPreferences.get_preset_index();
BoxPreferences.htab.position = 5; // Keymap
@@ -535,8 +535,8 @@ class BoxPreferences {
UIFiles.show("json", true, false, (dest: string) => {
if (!UIFiles.filename.endsWith(".json")) UIFiles.filename += ".json";
- let path: string = Path.data() + Path.sep + "keymap_presets" + Path.sep + Config.raw.keymap;
- File.copy(path, dest + Path.sep + UIFiles.filename);
+ let path: string = path_data() + path_sep + "keymap_presets" + path_sep + config_raw.keymap;
+ file_copy(path, dest + path_sep + UIFiles.filename);
@@ -546,15 +546,15 @@ class BoxPreferences {
let i: i32 = 0;
- for (let key in Config.keymap) {
+ for (let key in config_keymap) {
let h: zui_handle_t = zui_nest(zui_handle("boxpreferences_53"), i++);
- h.text = Config.keymap[key];
+ h.text = config_keymap[key];
let text: string = zui_text_input(h, key, zui_align_t.LEFT);
- Config.keymap[key] = text;
+ config_keymap[key] = text;
- Config.save_keymap();
+ config_save_keymap();
if (zui_tab(BoxPreferences.htab, tr("Plugins"), true)) {
@@ -567,7 +567,7 @@ class BoxPreferences {
let plugin_name: string = zui_text_input(zui_handle("boxpreferences_55", { text: "new_plugin" }), tr("Name"));
let template: string =
-`let plugin = Plugin.create();
+`let plugin = create();
let h1 = new Handle();
plugin.drawUI = (ui) { =>
if (Zui.panel(h1, 'New Plugin')) {
@@ -578,7 +578,7 @@ plugin.drawUI = (ui) { =>
if (!plugin_name.endsWith(".js")) plugin_name += ".js";
- let path: string = Path.data() + Path.sep + "plugins" + Path.sep + plugin_name;
+ let path: string = path_data() + path_sep + "plugins" + path_sep + plugin_name;
BoxPreferences.files_plugin = null; // Refresh file list
@@ -599,61 +599,61 @@ plugin.drawUI = (ui) { =>
BoxPreferences.fetch_plugins();
- if (Config.raw.plugins == null) Config.raw.plugins = [];
+ if (config_raw.plugins == null) config_raw.plugins = [];
let h: zui_handle_t = zui_handle("boxpreferences_56", { selected: false });
for (let f of BoxPreferences.files_plugin) {
let is_js: bool = f.endsWith(".js");
if (!is_js) continue;
- let enabled: bool = Config.raw.plugins.indexOf(f) >= 0;
+ let enabled: bool = config_raw.plugins.indexOf(f) >= 0;
h.selected = enabled;
let tag: string = is_js ? f.split(".")[0] : f;
zui_check(h, tag);
if (h.changed && h.selected != enabled) {
- h.selected ? Config.enable_plugin(f) : Config.disable_plugin(f);
+ h.selected ? config_enable_plugin(f) : config_disable_plugin(f);
base_redraw_ui();
- let path: string = Path.data() + Path.sep + "plugins" + Path.sep + f;
+ let path: string = path_data() + path_sep + "plugins" + path_sep + f;
if (UIMenu.menu_button(ui, tr("Edit in Text Editor"))) {
- File.start(path);
+ file_start(path);
if (UIMenu.menu_button(ui, tr("Edit in Script Tab"))) {
let blob: ArrayBuffer = data_get_blob("plugins/" + f);
TabScript.hscript.text = sys_buffer_to_string(blob);
data_delete_blob("plugins/" + f);
- Console.info(tr("Script opened"));
+ console_info(tr("Script opened"));
if (UIMenu.menu_button(ui, tr("Export"))) {
UIFiles.show("js", true, false, (dest: string) => {
if (!UIFiles.filename.endsWith(".js")) UIFiles.filename += ".js";
if (UIMenu.menu_button(ui, tr("Delete"))) {
- if (Config.raw.plugins.indexOf(f) >= 0) {
- array_remove(Config.raw.plugins, f);
- Plugin.stop(f);
+ if (config_raw.plugins.indexOf(f) >= 0) {
+ array_remove(config_raw.plugins, f);
+ plugin_stop(f);
array_remove(BoxPreferences.files_plugin, f);
- File.delete(path);
+ file_delete(path);
}, 4);
- }, 620, Config.raw.touch_ui ? 480 : 420, () => { Config.save(); });
+ }, 620, config_raw.touch_ui ? 480 : 420, () => { config_save(); });
static fetch_themes = () => {
- BoxPreferences.themes = File.read_directory(Path.data() + Path.sep + "themes");
+ BoxPreferences.themes = file_read_directory(path_data() + path_sep + "themes");
for (let i: i32 = 0; i < BoxPreferences.themes.length; ++i) BoxPreferences.themes[i] = BoxPreferences.themes[i].substr(0, BoxPreferences.themes[i].length - 5); // Strip .json
BoxPreferences.themes.unshift("default");
static fetch_keymaps = () => {
- BoxPreferences.files_keymap = File.read_directory(Path.data() + Path.sep + "keymap_presets");
+ BoxPreferences.files_keymap = file_read_directory(path_data() + path_sep + "keymap_presets");
for (let i: i32 = 0; i < BoxPreferences.files_keymap.length; ++i) {
BoxPreferences.files_keymap[i] = BoxPreferences.files_keymap[i].substr(0, BoxPreferences.files_keymap[i].length - 5); // Strip .json
@@ -661,22 +661,22 @@ plugin.drawUI = (ui) { =>
static fetch_plugins = () => {
- BoxPreferences.files_plugin = File.read_directory(Path.data() + Path.sep + "plugins");
+ BoxPreferences.files_plugin = file_read_directory(path_data() + path_sep + "plugins");
static get_theme_index = (): i32 => {
- return BoxPreferences.themes.indexOf(Config.raw.theme.substr(0, Config.raw.theme.length - 5)); // Strip .json
+ return BoxPreferences.themes.indexOf(config_raw.theme.substr(0, config_raw.theme.length - 5)); // Strip .json
static get_preset_index = (): i32 => {
- return BoxPreferences.files_keymap.indexOf(Config.raw.keymap.substr(0, Config.raw.keymap.length - 5)); // Strip .json
+ return BoxPreferences.files_keymap.indexOf(config_raw.keymap.substr(0, config_raw.keymap.length - 5)); // Strip .json
static set_scale = () => {
- let scale: f32 = Config.raw.window_scale;
+ let scale: f32 = config_raw.window_scale;
zui_set_scale(UIBase.ui, scale);
UIHeader.headerh = Math.floor(UIHeader.default_header_h * scale);
- Config.raw.layout[layout_size_t.STATUS_H] = Math.floor(UIStatus.default_status_h * scale);
+ config_raw.layout[layout_size_t.STATUS_H] = Math.floor(UIStatus.default_status_h * scale);
UIMenubar.menubarw = Math.floor(UIMenubar.default_menubar_w * scale);
UIBase.set_icon_scale();
zui_set_scale(UINodes.ui, scale);
@@ -685,7 +685,7 @@ plugin.drawUI = (ui) { =>
zui_set_scale(base_ui_menu, scale);
base_resize();
- Config.raw.layout[layout_size_t.SIDEBAR_W] = Math.floor(UIBase.default_sidebar_w * scale);
+ config_raw.layout[layout_size_t.SIDEBAR_W] = Math.floor(UIBase.default_sidebar_w * scale);
UIToolbar.toolbar_w = Math.floor(UIToolbar.default_toolbar_w * scale);
@@ -42,16 +42,16 @@ class BoxProjects {
BoxProjects.draw_badge(ui);
- Project.project_new();
- Viewport.scale_to_bounds();
+ project_new();
+ viewport_scale_to_bounds();
// Pick unique name
let j: i32 = 0;
let title: string = tr("untitled") + i;
- while (j < Config.raw.recent_projects.length) {
- let base: string = Config.raw.recent_projects[j];
- base = base.substring(base.lastIndexOf(Path.sep) + 1, base.lastIndexOf("."));
+ while (j < config_raw.recent_projects.length) {
+ let base: string = config_raw.recent_projects[j];
+ base = base.substring(base.lastIndexOf(path_sep) + 1, base.lastIndexOf("."));
j++;
if (title == base) {
i++;
@@ -66,7 +66,7 @@ class BoxProjects {
let slotw: i32 = Math.floor(150 * zui_SCALE(ui));
let num: i32 = Math.floor(sys_width() / slotw);
- let recent_projects: string[] = Config.raw.recent_projects;
+ let recent_projects: string[] = config_raw.recent_projects;
let show_asset_names: bool = true;
for (let row: i32 = 0; row < Math.ceil(recent_projects.length / num); ++row) {
@@ -124,7 +124,7 @@ class BoxProjects {
- Console.toast(tr("Opening project"));
+ console_toast(tr("Opening project"));
base_notify_on_next_frame(doImport);
@@ -132,16 +132,16 @@ class BoxProjects {
- let name: string = path.substring(path.lastIndexOf(Path.sep) + 1, path.lastIndexOf("."));
+ let name: string = path.substring(path.lastIndexOf(path_sep) + 1, path.lastIndexOf("."));
// if (UIMenu.menuButton(ui, tr("Duplicate"))) {}
- File.delete(icon_path);
+ file_delete(icon_path);
let data_path: string = path.substr(0, path.length - 4);
- File.delete(data_path);
+ file_delete(data_path);
recent_projects.splice(i, 1);
@@ -176,22 +176,22 @@ class BoxProjects {
- ui.enabled = Config.raw.recent_projects.length > 0;
+ ui.enabled = config_raw.recent_projects.length > 0;
BoxProjects.hsearch.text = zui_text_input(BoxProjects.hsearch, tr("Search"), zui_align_t.LEFT, true, true);
- for (let path of Config.raw.recent_projects) {
+ for (let path of config_raw.recent_projects) {
let file: string = path;
///if krom_windows
file = string_replace_all(path, "/", "\\");
file = string_replace_all(path, "\\", "/");
- file = file.substr(file.lastIndexOf(Path.sep) + 1);
+ file = file.substr(file.lastIndexOf(path_sep) + 1);
if (file.toLowerCase().indexOf(BoxProjects.hsearch.text.toLowerCase()) < 0) continue; // Search filter
- if (zui_button(file, zui_align_t.LEFT) && File.exists(path)) {
+ if (zui_button(file, zui_align_t.LEFT) && file_exists(path)) {
if (current != null) g2_end();
@@ -203,16 +203,16 @@ class BoxProjects {
if (ui.is_hovered) zui_tooltip(path);
if (zui_button(tr("Clear"), zui_align_t.LEFT)) {
- Config.raw.recent_projects = [];
+ config_raw.recent_projects = [];
- if (zui_button(tr("New Project..."), zui_align_t.LEFT)) Project.project_new_box();
- if (zui_button(tr("Open..."), zui_align_t.LEFT)) Project.project_open();
+ if (zui_button(tr("New .."), zui_align_t.LEFT)) project_new_box();
+ if (zui_button(tr("Open..."), zui_align_t.LEFT)) project_open();
@@ -225,13 +225,13 @@ class BoxProjects {
static get_started_tab = (ui: zui_t) => {
if (zui_tab(BoxProjects.htab, tr("Get Started"), true)) {
if (zui_button(tr("Manual"))) {
- File.load_url(manifest_url + "/manual");
+ file_load_url(manifest_url + "/manual");
if (zui_button(tr("How To"))) {
- File.load_url(manifest_url + "/howto");
+ file_load_url(manifest_url + "/howto");
if (zui_button(tr("What's New"))) {
- File.load_url(manifest_url + "/notes");
+ file_load_url(manifest_url + "/notes");
@@ -1,232 +0,0 @@
-class Camera {
- static origins: vec4_t[];
- static views: mat4_t[];
- static redraws: i32 = 0;
- static dir: vec4_t = vec4_create();
- static ease: f32 = 1.0;
- static controls_down: bool = false;
- constructor() {
- Camera.reset();
- static update = () => {
- let camera: camera_object_t = scene_camera;
- if (mouse_view_x() < 0 ||
- mouse_view_x() > app_w() ||
- mouse_view_y() < 0 ||
- mouse_view_y() > app_h()) {
- if (Config.raw.wrap_mouse && Camera.controls_down) {
- if (mouse_view_x() < 0) {
- mouse_x = mouse_last_x = app_x() + app_w();
- krom_set_mouse_position(Math.floor(mouse_x), Math.floor(mouse_y));
- else if (mouse_view_x() > app_w()) {
- mouse_x = mouse_last_x = app_x();
- else if (mouse_view_y() < 0) {
- mouse_y = mouse_last_y = app_y() + app_h();
- else if (mouse_view_y() > app_h()) {
- mouse_y = mouse_last_y = app_y();
- else {
- return;
- let modif_key: bool = keyboard_down("alt") || keyboard_down("shift") || keyboard_down("control");
- let modif: bool = modif_key || Config.keymap.action_rotate == "middle";
- let default_keymap: bool = Config.raw.keymap == "default.json";
- if (Operator.shortcut(Config.keymap.action_rotate, ShortcutType.ShortcutStarted) ||
- Operator.shortcut(Config.keymap.action_zoom, ShortcutType.ShortcutStarted) ||
- Operator.shortcut(Config.keymap.action_pan, ShortcutType.ShortcutStarted) ||
- Operator.shortcut(Config.keymap.rotate_envmap, ShortcutType.ShortcutStarted) ||
- Operator.shortcut(Config.keymap.rotate_light, ShortcutType.ShortcutStarted) ||
- (mouse_started("right") && !modif) ||
- (mouse_started("middle") && !modif) ||
- (mouse_wheel_delta != 0 && !modif_key)) {
- Camera.controls_down = true;
- else if (!Operator.shortcut(Config.keymap.action_rotate, ShortcutType.ShortcutDown) &&
- !Operator.shortcut(Config.keymap.action_zoom, ShortcutType.ShortcutDown) &&
- !Operator.shortcut(Config.keymap.action_pan, ShortcutType.ShortcutDown) &&
- !Operator.shortcut(Config.keymap.rotate_envmap, ShortcutType.ShortcutDown) &&
- !Operator.shortcut(Config.keymap.rotate_light, ShortcutType.ShortcutDown) &&
- !(mouse_down("right") && !modif) &&
- !(mouse_down("middle") && !modif) &&
- (mouse_wheel_delta == 0 && !modif_key)) {
- Camera.controls_down = false;
- if (_input_occupied || !base_ui_enabled || base_is_dragging || base_is_scrolling() || base_is_combo_selected() || !Camera.controls_down) {
- let controls: camera_controls_t = Context.raw.camera_controls;
- if (controls == camera_controls_t.ORBIT && (Operator.shortcut(Config.keymap.action_rotate, ShortcutType.ShortcutDown) || (mouse_down("right") && !modif && default_keymap))) {
- Camera.redraws = 2;
- let dist: f32 = Camera.distance();
- transform_move(camera.base.transform, camera_object_look_world(camera), dist);
- transform_rotate(camera.base.transform, vec4_z_axis(), -mouse_movement_x / 100 * Config.raw.camera_rotation_speed);
- transform_rotate(camera.base.transform, camera_object_right_world(camera), -mouse_movement_y / 100 * Config.raw.camera_rotation_speed);
- if (camera_object_up_world(camera).z < 0) {
- transform_rotate(camera.base.transform, camera_object_right_world(camera), mouse_movement_y / 100 * Config.raw.camera_rotation_speed);
- transform_move(camera.base.transform, camera_object_look_world(camera), -dist);
- else if (controls == camera_controls_t.ROTATE && (Operator.shortcut(Config.keymap.action_rotate, ShortcutType.ShortcutDown) || (mouse_down("right") && !modif && default_keymap))) {
- let t: transform_t = Context.main_object().base.transform;
- let up: vec4_t = vec4_normalize(transform_up(t));
- transform_rotate(t, up, mouse_movement_x / 100 * Config.raw.camera_rotation_speed);
- let right: vec4_t = vec4_normalize(camera_object_right_world(camera));
- transform_rotate(t, right, mouse_movement_y / 100 * Config.raw.camera_rotation_speed);
- transform_build_matrix(t);
- if (transform_up(t).z < 0) {
- transform_rotate(t, right, -mouse_movement_y / 100 * Config.raw.camera_rotation_speed);
- if (controls == camera_controls_t.ROTATE || controls == camera_controls_t.ORBIT) {
- Camera.pan_action(modif, default_keymap);
- if (Operator.shortcut(Config.keymap.action_zoom, ShortcutType.ShortcutDown)) {
- let f: f32 = Camera.get_zoom_delta() / 150;
- f *= Camera.get_camera_zoom_speed();
- transform_move(camera.base.transform, camera_object_look(camera), f);
- if (mouse_wheel_delta != 0 && !modif_key) {
- let f: f32 = mouse_wheel_delta * (-0.1);
- else if (controls == camera_controls_t.FLY && mouse_down("right")) {
- let move_forward: bool = keyboard_down("w") || keyboard_down("up") || mouse_wheel_delta < 0;
- let move_backward: bool = keyboard_down("s") || keyboard_down("down") || mouse_wheel_delta > 0;
- let strafe_left: bool = keyboard_down("a") || keyboard_down("left");
- let strafe_right: bool = keyboard_down("d") || keyboard_down("right");
- let strafe_up: bool = keyboard_down("e");
- let strafe_down: bool = keyboard_down("q");
- let fast: f32 = keyboard_down("shift") ? 2.0 : (keyboard_down("alt") ? 0.5 : 1.0);
- if (mouse_wheel_delta != 0) {
- fast *= Math.abs(mouse_wheel_delta) * 4.0;
- if (move_forward || move_backward || strafe_right || strafe_left || strafe_up || strafe_down) {
- Camera.ease += time_delta() * 15;
- if (Camera.ease > 1.0) Camera.ease = 1.0;
- vec4_set(Camera.dir, 0, 0, 0);
- if (move_forward) vec4_add_f(Camera.dir, camera_object_look(camera).x, camera_object_look(camera).y, camera_object_look(camera).z);
- if (move_backward) vec4_add_f(Camera.dir, -camera_object_look(camera).x, -camera_object_look(camera).y, -camera_object_look(camera).z);
- if (strafe_right) vec4_add_f(Camera.dir, camera_object_right(camera).x, camera_object_right(camera).y, camera_object_right(camera).z);
- if (strafe_left) vec4_add_f(Camera.dir, -camera_object_right(camera).x, -camera_object_right(camera).y, -camera_object_right(camera).z);
- if (strafe_up) vec4_add_f(Camera.dir, 0, 0, 1);
- if (strafe_down) vec4_add_f(Camera.dir, 0, 0, -1);
- Camera.ease -= time_delta() * 20.0 * Camera.ease;
- if (Camera.ease < 0.0) Camera.ease = 0.0;
- let d: f32 = time_delta() * fast * Camera.ease * 2.0 * ((move_forward || move_backward) ? Config.raw.camera_zoom_speed : Config.raw.camera_pan_speed);
- if (d > 0.0) {
- transform_move(camera.base.transform, Camera.dir, d);
- if (Context.raw.camera_type == camera_type_t.ORTHOGRAPHIC) {
- transform_rotate(camera.base.transform, vec4_z_axis(), -mouse_movement_x / 200 * Config.raw.camera_rotation_speed);
- transform_rotate(camera.base.transform, camera_object_right(camera), -mouse_movement_y / 200 * Config.raw.camera_rotation_speed);
- if (Operator.shortcut(Config.keymap.rotate_light, ShortcutType.ShortcutDown)) {
- let light: light_object_t = scene_lights[0];
- Context.raw.light_angle = (Context.raw.light_angle + ((mouse_movement_x / 100) % (2 * Math.PI) + 2 * Math.PI)) % (2 * Math.PI);
- let m: mat4_t = mat4_rot_z(mouse_movement_x / 100);
- mat4_mult_mat(light.base.transform.local, m);
- transform_decompose(light.base.transform);
- if (Operator.shortcut(Config.keymap.rotate_envmap, ShortcutType.ShortcutDown)) {
- Context.raw.envmap_angle -= mouse_movement_x / 100;
- if (Camera.redraws > 0) {
- Camera.redraws--;
- static distance = (): f32 => {
- return vec4_dist(Camera.origins[Camera.index()], camera.base.transform.loc);
- static index = (): i32 => {
- return Context.raw.view_index_last > 0 ? 1 : 0;
- static get_camera_zoom_speed = (): f32 => {
- let sign: i32 = Config.raw.zoom_direction == zoom_direction_t.VERTICAL_INVERTED ||
- Config.raw.zoom_direction == zoom_direction_t.HORIZONTAL_INVERTED ||
- Config.raw.zoom_direction == zoom_direction_t.VERTICAL_HORIZONTAL_INVERTED ? -1 : 1;
- return Config.raw.camera_zoom_speed * sign;
- static reset = (viewIndex: i32 = -1) => {
- if (viewIndex == -1) {
- Camera.origins = [vec4_create(0, 0, 0), vec4_create(0, 0, 0)];
- Camera.views = [mat4_clone(camera.base.transform.local), mat4_clone(camera.base.transform.local)];
- Camera.origins[viewIndex] = vec4_create(0, 0, 0);
- Camera.views[viewIndex] = mat4_clone(camera.base.transform.local);
- static pan_action = (modif: bool, defaultKeymap: bool) => {
- if (Operator.shortcut(Config.keymap.action_pan, ShortcutType.ShortcutDown) || (mouse_down("middle") && !modif && defaultKeymap)) {
- let look: vec4_t = vec4_mult(vec4_normalize(transform_look(camera.base.transform)), mouse_movement_y / 150 * Config.raw.camera_pan_speed);
- let right: vec4_t = vec4_mult(vec4_normalize(transform_right(camera.base.transform)), -mouse_movement_x / 150 * Config.raw.camera_pan_speed);
- vec4_add(camera.base.transform.loc, look);
- vec4_add(camera.base.transform.loc, right);
- vec4_add(Camera.origins[Camera.index()], look);
- vec4_add(Camera.origins[Camera.index()], right);
- camera_object_build_mat(camera);
- static get_zoom_delta = (): f32 => {
- return Config.raw.zoom_direction == zoom_direction_t.VERTICAL ? -mouse_movement_y :
- Config.raw.zoom_direction == zoom_direction_t.VERTICAL_INVERTED ? -mouse_movement_y :
- Config.raw.zoom_direction == zoom_direction_t.HORIZONTAL ? mouse_movement_x :
- Config.raw.zoom_direction == zoom_direction_t.HORIZONTAL_INVERTED ? mouse_movement_x :
- -(mouse_movement_y - mouse_movement_x);
-}
@@ -1,304 +0,0 @@
-class Config {
- static raw: config_t = null;
- static keymap: any;
- static config_loaded: bool = false;
- static button_align: zui_align_t = zui_align_t.LEFT;
- static default_button_spacing: string = " ";
- static button_spacing: string = Config.default_button_spacing;
- static load = (done: ()=>void) => {
- try {
- let blob: ArrayBuffer = data_get_blob((Path.is_protected() ? krom_save_path() : "") + "config.json");
- Config.config_loaded = true;
- Config.raw = JSON.parse(sys_buffer_to_string(blob));
- done();
- catch (e: any) {
- ///if krom_linux
- try { // Protected directory
- let blob: ArrayBuffer = data_get_blob(krom_save_path() + "config.json");
- krom_log(e);
- ///else
- ///end
- static save = () => {
- // Use system application data folder
- // when running from protected path like "Program Files"
- let path: string = (Path.is_protected() ? krom_save_path() : Path.data() + Path.sep) + "config.json";
- let buffer: buffer_t = sys_string_to_buffer(JSON.stringify(Config.raw));
- krom_file_save_bytes(path, buffer);
- ///if krom_linux // Protected directory
- if (!File.exists(path)) krom_file_save_bytes(krom_save_path() + "config.json", buffer);
- static init = () => {
- if (!Config.config_loaded || Config.raw == null) {
- Config.raw = {};
- Config.raw.locale = "system";
- Config.raw.window_mode = 0;
- Config.raw.window_resizable = true;
- Config.raw.window_minimizable = true;
- Config.raw.window_maximizable = true;
- Config.raw.window_w = 1600;
- Config.raw.window_h = 900;
- ///if krom_darwin
- Config.raw.window_w *= 2;
- Config.raw.window_h *= 2;
- Config.raw.window_x = -1;
- Config.raw.window_y = -1;
- Config.raw.window_scale = 1.0;
- if (sys_display_width() >= 2560 && sys_display_height() >= 1600) {
- Config.raw.window_scale = 2.0;
- ///if (krom_android || krom_ios || krom_darwin)
- Config.raw.window_vsync = true;
- Config.raw.window_frequency = sys_display_frequency();
- Config.raw.rp_bloom = false;
- Config.raw.rp_gi = false;
- Config.raw.rp_vignette = 0.2;
- Config.raw.rp_grain = 0.09;
- Config.raw.rp_motionblur = false;
- ///if (krom_android || krom_ios)
- Config.raw.rp_ssao = false;
- Config.raw.rp_ssao = true;
- Config.raw.rp_ssr = false;
- Config.raw.rp_supersample = 1.0;
- Config.raw.version = manifest_version;
- Config.raw.sha = Config.get_sha();
- base_init_config();
- // Upgrade config format created by older ArmorPaint build
- // if (Config.raw.version != manifest_version) {
- // Config.raw.version = manifest_version;
- // save();
- // }
- if (Config.raw.sha != Config.get_sha()) {
- Config.config_loaded = false;
- Config.init();
- base_res_handle.position = Config.raw.layer_res;
- static get_sha = (): string => {
- let sha: string = "";
- let blob: ArrayBuffer = data_get_blob("version.json");
- sha = JSON.parse(sys_buffer_to_string(blob)).sha;
- return sha;
- static get_date = (): string => {
- let date: string = "";
- date = JSON.parse(sys_buffer_to_string(blob)).date;
- return date;
- static get_options = (): kinc_sys_ops_t => {
- let window_mode: window_mode_t = Config.raw.window_mode == 0 ? window_mode_t.WINDOWED : window_mode_t.FULLSCREEN;
- let window_features: window_features_t = window_features_t.NONE;
- if (Config.raw.window_resizable) window_features |= window_features_t.RESIZABLE;
- if (Config.raw.window_maximizable) window_features |= window_features_t.MAXIMIZABLE;
- if (Config.raw.window_minimizable) window_features |= window_features_t.MINIMIZABLE;
- let title: string = "untitled - " + manifest_title;
- return {
- title: title,
- width: Config.raw.window_w,
- height: Config.raw.window_h,
- x: Config.raw.window_x,
- y: Config.raw.window_y,
- mode: window_mode,
- features: window_features,
- vsync: Config.raw.window_vsync,
- frequency: Config.raw.window_frequency
- };
- static restore = () => {
- zui_children = new Map(); // Reset ui handles
- let _layout: i32[] = Config.raw.layout;
- Config.raw.layout = _layout;
- base_init_layout();
- Translator.load_translations(Config.raw.locale);
- static import_from = (from: config_t) => {
- let _sha: string = Config.raw.sha;
- let _version: string = Config.raw.version;
- Config.raw = from;
- Config.raw.sha = _sha;
- Config.raw.version = _version;
- static apply_config = () => {
- Config.raw.rp_ssao = Context.raw.hssao.selected;
- Config.raw.rp_ssr = Context.raw.hssr.selected;
- Config.raw.rp_bloom = Context.raw.hbloom.selected;
- Config.raw.rp_gi = Context.raw.hvxao.selected;
- Config.raw.rp_supersample = Config.get_super_sample_size(Context.raw.hsupersample.position);
- let current: image_t = _g2_current;
- if (current != null) g2_end();
- RenderPathBase.apply_config();
- if (current != null) g2_begin(current);
- static load_keymap = () => {
- if (Config.raw.keymap == "default.json") { // Built-in default
- Config.keymap = base_default_keymap;
- let blob: ArrayBuffer = data_get_blob("keymap_presets/" + Config.raw.keymap);
- Config.keymap = JSON.parse(sys_buffer_to_string(blob));
- // Fill in undefined keys with defaults
- for (let field in base_default_keymap) {
- if (!(field in Config.keymap)) {
- let adefault_keymap: any = base_default_keymap;
- Config.keymap[field] = adefault_keymap[field];
- static save_keymap = () => {
- if (Config.raw.keymap == "default.json") return;
- let path: string = data_path() + "keymap_presets/" + Config.raw.keymap;
- let buffer: buffer_t = sys_string_to_buffer(JSON.stringify(Config.keymap));
- static get_super_sample_quality = (f: f32): i32 => {
- return f == 0.25 ? 0 :
- f == 0.5 ? 1 :
- f == 1.0 ? 2 :
- f == 1.5 ? 3 :
- f == 2.0 ? 4 : 5;
- static get_super_sample_size = (i: i32): f32 => {
- return i == 0 ? 0.25 :
- i == 1 ? 0.5 :
- i == 2 ? 1.0 :
- i == 3 ? 1.5 :
- i == 4 ? 2.0 : 4.0;
- static get_texture_res = (): i32 => {
- let res: i32 = base_res_handle.position;
- return res == texture_res_t.RES128 ? 128 :
- res == texture_res_t.RES256 ? 256 :
- res == texture_res_t.RES512 ? 512 :
- res == texture_res_t.RES1024 ? 1024 :
- res == texture_res_t.RES2048 ? 2048 :
- res == texture_res_t.RES4096 ? 4096 :
- res == texture_res_t.RES8192 ? 8192 :
- res == texture_res_t.RES16384 ? 16384 : 0;
- static get_texture_res_x = (): i32 => {
- return Context.raw.project_aspect_ratio == 2 ? Math.floor(Config.get_texture_res() / 2) : Config.get_texture_res();
- static get_texture_res_y = (): i32 => {
- return Context.raw.project_aspect_ratio == 1 ? Math.floor(Config.get_texture_res() / 2) : Config.get_texture_res();
- static get_texture_res_pos = (i: i32): i32 => {
- return i == 128 ? texture_res_t.RES128 :
- i == 256 ? texture_res_t.RES256 :
- i == 512 ? texture_res_t.RES512 :
- i == 1024 ? texture_res_t.RES1024 :
- i == 2048 ? texture_res_t.RES2048 :
- i == 4096 ? texture_res_t.RES4096 :
- i == 8192 ? texture_res_t.RES8192 :
- i == 16384 ? texture_res_t.RES16384 : 0;
- static load_theme = (theme: string, tagRedraw: bool = true) => {
- if (theme == "default.json") { // Built-in default
- base_theme = zui_theme_create();
- let b: ArrayBuffer = data_get_blob("themes/" + theme);
- let parsed: any = JSON.parse(sys_buffer_to_string(b));
- for (let key in base_theme) {
- if (key == "theme_") continue;
- if (key.startsWith("set_")) continue;
- if (key.startsWith("get_")) key = key.substr(4);
- let atheme: any = base_theme;
- atheme[key] = parsed[key];
- base_theme.FILL_WINDOW_BG = true;
- if (tagRedraw) {
- for (let ui of base_get_uis()) ui.t = base_theme;
- UIBase.tag_ui_redraw();
- // Enlarge elements
- base_theme.FULL_TABS = true;
- base_theme.ELEMENT_H = 24 + 6;
- base_theme.BUTTON_H = 22 + 6;
- base_theme.FONT_SIZE = 13 + 2;
- base_theme.ARROW_SIZE = 5 + 2;
- base_theme.CHECK_SIZE = 15 + 4;
- base_theme.CHECK_SELECT_SIZE = 8 + 2;
- Config.button_align = zui_align_t.LEFT;
- Config.button_spacing = "";
- base_theme.FULL_TABS = false;
- Config.button_spacing = Config.default_button_spacing;
- static enable_plugin = (f: string) => {
- Config.raw.plugins.push(f);
- Plugin.start(f);
- static disable_plugin = (f: string) => {
@@ -1,76 +0,0 @@
-class Console {
- static message: string = "";
- static message_timer: f32 = 0.0;
- static message_color: i32 = 0x00000000;
- static last_traces: string[] = [""];
- static progress_text: string = null;
- static draw_toast = (s: string) => {
- g2_set_color(0x55000000);
- g2_fill_rect(0, 0, sys_width(), sys_height());
- let scale: f32 = zui_SCALE(base_get_uis()[0]);
- let x: f32 = sys_width() / 2;
- let y: f32 = sys_height() - 200 * scale;
- g2_fill_rect(x - 200 * scale, y, 400 * scale, 80 * scale);
- g2_set_font(base_font);
- g2_set_font_size(Math.floor(22 * scale));
- g2_set_color(0xffffffff);
- g2_draw_string(s, x - g2_font_width(_g2_font, _g2_font_size, s) / 2, y + 40 * scale - g2_font_height(_g2_font, _g2_font_size) / 2);
- static toast = (s: string) => {
- // Show a popup message
- let _render = () => {
- Console.draw_toast(s);
- base_notify_on_next_frame(() => {
- app_remove_render_2d(_render);
- });
- app_notify_on_render_2d(_render);
- Console.console_trace(s);
- static draw_progress = () => {
- Console.draw_toast(Console.progress_text);
- static progress = (s: string) => {
- // Keep popup message displayed until s == null
- if (s == null) {
- app_remove_render_2d(Console.draw_progress);
- else if (Console.progress_text == null) {
- app_notify_on_render_2d(Console.draw_progress);
- if (s != null) Console.console_trace(s);
- Console.progress_text = s;
- static info = (s: string) => {
- Console.message_timer = 5.0;
- Console.message = s;
- Console.message_color = 0x00000000;
- base_redraw_status();
- static error = (s: string) => {
- Console.message_timer = 8.0;
- Console.message_color = 0xffaa0000;
- static log = (s: string) => {
- static console_trace = (v: any) => {
- base_redraw_console();
- Console.last_traces.unshift(String(v));
- if (Console.last_traces.length > 100) Console.last_traces.pop();
@@ -1,434 +0,0 @@
-/// <reference path='./ContextFormat.ts'/>
-class Context {
- static raw: TContext = new TContext(); //{};
- static use_deferred = (): bool => {
- ///if is_paint
- return Context.raw.render_mode != render_mode_t.FORWARD && (Context.raw.viewport_mode == viewport_mode_t.LIT || Context.raw.viewport_mode == viewport_mode_t.PATH_TRACE) && Context.raw.tool != workspace_tool_t.COLORID;
- ///if (is_sculpt || is_lab)
- return Context.raw.render_mode != render_mode_t.FORWARD && (Context.raw.viewport_mode == viewport_mode_t.LIT || Context.raw.viewport_mode == viewport_mode_t.PATH_TRACE);
- ///if (is_paint || is_sculpt)
- static select_material = (i: i32) => {
- if (Project.materials.length <= i) return;
- Context.set_material(Project.materials[i]);
- static set_material = (m: SlotMaterialRaw) => {
- if (Project.materials.indexOf(m) == -1) return;
- Context.raw.material = m;
- MakeMaterial.parse_paint_material();
- UIBase.hwnds[tab_area_t.SIDEBAR1].redraws = 2;
- UIHeader.header_handle.redraws = 2;
- UINodes.hwnd.redraws = 2;
- UINodes.group_stack = [];
- if (decal) {
- let _next = () => {
- UtilRender.make_decal_preview();
- base_notify_on_next_frame(_next);
- static select_brush = (i: i32) => {
- if (Project.brushes.length <= i) return;
- Context.set_brush(Project.brushes[i]);
- static set_brush = (b: SlotBrushRaw) => {
- if (Project.brushes.indexOf(b) == -1) return;
- Context.raw.brush = b;
- MakeMaterial.parse_brush();
- static select_font = (i: i32) => {
- if (Project.fonts.length <= i) return;
- Context.set_font(Project.fonts[i]);
- static set_font = (f: SlotFontRaw) => {
- if (Project.fonts.indexOf(f) == -1) return;
- Context.raw.font = f;
- UtilRender.make_text_preview();
- UIBase.hwnds[tab_area_t.STATUS].redraws = 2;
- UIView2D.hwnd.redraws = 2;
- static select_layer = (i: i32) => {
- if (Project.layers.length <= i) return;
- Context.set_layer(Project.layers[i]);
- static set_layer = (l: SlotLayerRaw) => {
- if (l == Context.raw.layer) return;
- base_set_object_mask();
- MakeMaterial.parse_mesh_material();
- UIBase.hwnds[tab_area_t.SIDEBAR0].redraws = 2;
- static select_tool = (i: i32) => {
- Context.raw.tool = i;
- let _viewport_mode: viewport_mode_t = Context.raw.viewport_mode;
- Context.raw.viewport_mode = -1 as viewport_mode_t;
- Context.set_viewport_mode(_viewport_mode);
- Context.init_tool();
- UIToolbar.toolbar_handle.redraws = 2;
- static init_tool = () => {
- else if (Context.raw.tool == workspace_tool_t.PARTICLE) {
- UtilParticle.init_particle();
- MakeMaterial.parse_particle_material();
- else if (Context.raw.tool == workspace_tool_t.BAKE) {
- ///if (krom_direct3d12 || krom_vulkan || krom_metal)
- // Bake in lit mode for now
- if (Context.raw.viewport_mode == viewport_mode_t.PATH_TRACE) {
- Context.raw.viewport_mode = viewport_mode_t.LIT;
- else if (Context.raw.tool == workspace_tool_t.MATERIAL) {
- base_update_fill_layers();
- Context.main_object().skip_context = null;
- ///if krom_ios
- // No hover on iPad, decals are painted by pen release
- Config.raw.brush_live = decal;
- static select_paint_object = (o: mesh_object_t) => {
- for (let p of Project.paint_objects) p.skip_context = "paint";
- Context.raw.paint_object = o;
- let mask: i32 = SlotLayer.get_object_mask(Context.raw.layer);
- if (Context.layer_filter_used()) mask = Context.raw.layer_filter;
- if (Context.raw.merged_object == null || mask > 0) {
- Context.raw.paint_object.skip_context = "";
- UtilUV.uvmap_cached = false;
- UtilUV.trianglemap_cached = false;
- UtilUV.dilatemap_cached = false;
- ///if is_lab
- static main_object = (): mesh_object_t => {
- for (let po of Project.paint_objects) if (po.base.children.length > 0) return po;
- return Project.paint_objects[0];
- static layer_filter_used = (): bool => {
- return Context.raw.layer_filter > 0 && Context.raw.layer_filter <= Project.paint_objects.length;
- return true;
- static object_mask_used = (): bool => {
- return SlotLayer.get_object_mask(Context.raw.layer) > 0 && SlotLayer.get_object_mask(Context.raw.layer) <= Project.paint_objects.length;
- return false;
- static in_viewport = (): bool => {
- return Context.raw.paint_vec.x < 1 && Context.raw.paint_vec.x > 0 &&
- Context.raw.paint_vec.y < 1 && Context.raw.paint_vec.y > 0;
- static in_paint_area = (): bool => {
- let right: i32 = app_w();
- if (UIView2D.show) right += UIView2D.ww;
- return mouse_view_x() > 0 && mouse_view_x() < right &&
- mouse_view_y() > 0 && mouse_view_y() < app_h();
- return Context.in_viewport();
- static in_layers = (): bool => {
- return zui_get_hovered_tab_name() == tr("Layers");
- static in_materials = (): bool => {
- return zui_get_hovered_tab_name() == tr("Materials");
- static in_2d_view = (type: view_2d_type_t = view_2d_type_t.LAYER): bool => {
- return UIView2D.show && UIView2D.type == type &&
- mouse_x > UIView2D.wx && mouse_x < UIView2D.wx + UIView2D.ww &&
- mouse_y > UIView2D.wy && mouse_y < UIView2D.wy + UIView2D.wh;
- static in_nodes = (): bool => {
- return UINodes.show &&
- mouse_x > UINodes.wx && mouse_x < UINodes.wx + UINodes.ww &&
- mouse_y > UINodes.wy && mouse_y < UINodes.wy + UINodes.wh;
- static in_swatches = (): bool => {
- return zui_get_hovered_tab_name() == tr("Swatches");
- static in_browser = (): bool => {
- return zui_get_hovered_tab_name() == tr("Browser");
- static get_area_type = (): area_type_t => {
- if (Context.in_viewport()) return area_type_t.VIEWPORT;
- if (Context.in_nodes()) return area_type_t.NODES;
- if (Context.in_browser()) return area_type_t.BROWSER;
- if (Context.in_2d_view()) return area_type_t.VIEW2D;
- if (Context.in_layers()) return area_type_t.LAYERS;
- if (Context.in_materials()) return area_type_t.MATERIALS;
- return -1 as area_type_t;
- static set_viewport_mode = (mode: viewport_mode_t) => {
- if (mode == Context.raw.viewport_mode) return;
- Context.raw.viewport_mode = mode;
- if (Context.use_deferred()) {
- render_path_commands = RenderPathDeferred.commands;
- render_path_commands = RenderPathForward.commands;
- let _workspace: i32 = UIHeader.worktab.position;
- UIHeader.worktab.position = 0;
- UIHeader.worktab.position = _workspace;
- static load_envmap = () => {
- if (!Context.raw.envmap_loaded) {
- // TODO: Unable to share texture for both radiance and envmap - reload image
- Context.raw.envmap_loaded = true;
- data_cached_images.delete("World_radiance.k");
- world_data_load_envmap(scene_world, (_) => {});
- if (Context.raw.saved_envmap == null) Context.raw.saved_envmap = scene_world._.envmap;
- static update_envmap = () => {
- if (Context.raw.show_envmap) {
- scene_world._.envmap = Context.raw.show_envmap_blur ? scene_world._.radiance_mipmaps[0] : Context.raw.saved_envmap;
- static set_viewport_shader = (viewportShader: (ns: NodeShaderRaw)=>string) => {
- Context.raw.viewport_shader = viewportShader;
- static set_render_path = () => {
- if (Context.raw.render_mode == render_mode_t.FORWARD || Context.raw.viewport_shader != null) {
- app_notify_on_init(() => {
- static enable_import_plugin = (file: string): bool => {
- // Return plugin name suitable for importing the specified file
- if (BoxPreferences.files_plugin == null) {
- BoxPreferences.fetch_plugins();
- let ext: string = file.substr(file.lastIndexOf(".") + 1);
- for (let f of BoxPreferences.files_plugin) {
- if (f.startsWith("import_") && f.indexOf(ext) >= 0) {
- Config.enable_plugin(f);
- Console.info(f + " " + tr("plugin enabled"));
- static set_swatch = (s: swatch_color_t) => {
- Context.raw.swatch = s;
- static run_brush = (from: i32) => {
- let left: f32 = 0.0;
- let right: f32 = 1.0;
- // First time init
- let nodes: zui_nodes_t = UINodes.get_nodes();
- let canvas: zui_node_canvas_t = UINodes.get_canvas(true);
- let inpaint: bool = nodes.nodes_selected_id.length > 0 && zui_get_node(canvas.nodes, nodes.nodes_selected_id[0]).type == "InpaintNode";
- // Paint bounds
- if (inpaint &&
- Context.raw.paint_vec.x > left &&
- !base_is_dragging &&
- !base_is_resizing &&
- !base_is_scrolling() &&
- !base_is_combo_selected()) {
- let down: bool = mouse_down() || pen_down();
- // Prevent painting the same spot
- if (down && same_spot) {
- Context.parse_brush_inputs();
- static parse_brush_inputs = () => {
- if (!Context.raw.registered) {
- Context.raw.registered = true;
- app_notify_on_update(Context.update);
- Context.raw.paint_vec = Context.raw.coords;
- let paint_x: f32 = mouse_view_x() / app_w();
- let paint_y: f32 = mouse_view_y() / app_h();
- if (mouse_started()) {
- Context.raw.start_x = mouse_view_x() / app_w();
- Context.raw.start_y = mouse_view_y() / app_h();
- if (pen_down()) {
- paint_x = pen_view_x() / app_w();
- paint_y = pen_view_y() / app_h();
- if (pen_started()) {
- Context.raw.start_x = pen_view_x() / app_w();
- Context.raw.start_y = pen_view_y() / app_h();
- if (Context.raw.lock_x) paint_x = Context.raw.start_x;
- if (Context.raw.lock_y) paint_y = Context.raw.start_y;
- Context.raw.coords.x = paint_x;
- Context.raw.coords.y = paint_y;
- if (Context.raw.lock_begin) {
- let dx: i32 = Math.abs(Context.raw.lock_start_x - mouse_view_x());
- let dy: i32 = Math.abs(Context.raw.lock_start_y - mouse_view_y());
- if (dx > 1 || dy > 1) {
- Context.raw.lock_begin = false;
- dx > dy ? Context.raw.lock_y = true : Context.raw.lock_x = true;
- Context.raw.lock_start_x = mouse_view_x();
- Context.raw.lock_start_y = mouse_view_y();
- Context.raw.lock_begin = true;
- Context.raw.lock_x = Context.raw.lock_y = Context.raw.lock_begin = false;
@@ -1,8 +1,8 @@
-/// <reference path='./Project.ts'/>
-/// <reference path='./Enums.ts'/>
+/// <reference path='./project.ts'/>
+/// <reference path='./enums.ts'/>
-// type TContext = {
-class TContext {
+// type context_t = {
+class context_t {
texture?: asset_t = null;
paint_object?: mesh_object_t;
@@ -20,7 +20,7 @@ class TContext {
view_index_last?: i32 = -1;
swatch?: swatch_color_t;
- picked_color?: swatch_color_t = Project.make_swatch();
+ picked_color?: swatch_color_t = make_swatch();
color_picker_callback?: (sc: swatch_color_t)=>void = null;
default_irradiance?: Float32Array = null;
@@ -13,25 +13,25 @@ class ExportArm {
static run_project = () => {
let mnodes: zui_node_canvas_t[] = [];
let c: zui_node_canvas_t = JSON.parse(JSON.stringify(m.canvas));
for (let n of c.nodes) ExportArm.export_node(n);
mnodes.push(c);
let bnodes: zui_node_canvas_t[] = [];
- for (let b of Project.brushes) bnodes.push(b.canvas);
+ for (let b of project_brushes) bnodes.push(b.canvas);
- let c: zui_node_canvas_t = JSON.parse(JSON.stringify(Project.canvas));
+ let c: zui_node_canvas_t = JSON.parse(JSON.stringify(project_canvas));
let mgroups: zui_node_canvas_t[] = null;
- if (Project.material_groups.length > 0) {
+ if (project_material_groups.length > 0) {
mgroups = [];
let c: zui_node_canvas_t = JSON.parse(JSON.stringify(g.canvas));
mgroups.push(c);
@@ -40,27 +40,27 @@ class ExportArm {
let md: mesh_data_t[] = [];
- for (let p of Project.paint_objects) md.push(p.data);
+ for (let p of project_paint_objects) md.push(p.data);
- let md: mesh_data_t = Project.paint_objects[0].data;
+ let md: mesh_data_t = project_paint_objects[0].data;
- let texture_files: string[] = ExportArm.assets_to_files(Project.filepath, Project.assets);
+ let texture_files: string[] = ExportArm.assets_to_files(project_filepath, project_assets);
- let font_files: string[] = ExportArm.fonts_to_files(Project.filepath, Project.fonts);
- let mesh_files: string[] = ExportArm.meshes_to_files(Project.filepath);
+ let font_files: string[] = ExportArm.fonts_to_files(project_filepath, project_fonts);
+ let mesh_files: string[] = ExportArm.meshes_to_files(project_filepath);
let bits_pos: i32 = base_bits_handle.position;
let bpp: i32 = bits_pos == texture_bits_t.BITS8 ? 8 : bits_pos == texture_bits_t.BITS16 ? 16 : 32;
let ld: layer_data_t[] = [];
ld.push({
name: l.name,
- res: l.texpaint != null ? l.texpaint.width : Project.layers[0].texpaint.width,
+ res: l.texpaint != null ? l.texpaint.width : project_layers[0].texpaint.width,
bpp: bpp,
texpaint: l.texpaint != null ? lz4_encode(image_get_pixels(l.texpaint)) : null,
uv_scale: l.scale,
@@ -68,10 +68,10 @@ class ExportArm {
uv_type: l.uv_type,
decal_mat: l.uv_type == uv_type_t.PROJECT ? mat4_to_f32_array(l.decal_mat) : null,
opacity_mask: l.mask_opacity,
- fill_layer: l.fill_layer != null ? Project.materials.indexOf(l.fill_layer) : -1,
+ fill_layer: l.fill_layer != null ? project_materials.indexOf(l.fill_layer) : -1,
object_mask: l.object_mask,
blending: l.blending,
- parent: l.parent != null ? Project.layers.indexOf(l.parent) : -1,
+ parent: l.parent != null ? project_layers.indexOf(l.parent) : -1,
visible: l.visible,
texpaint_nor: l.texpaint_nor != null ? lz4_encode(image_get_pixels(l.texpaint_nor)) : null,
@@ -92,23 +92,23 @@ class ExportArm {
- let packed_assets: packed_asset_t[] = (Project.raw.packed_assets == null || Project.raw.packed_assets.length == 0) ? null : Project.raw.packed_assets;
+ let packed_assets: packed_asset_t[] = (project_raw.packed_assets == null || project_raw.packed_assets.length == 0) ? null : project_raw.packed_assets;
///if krom_ios
let same_drive: bool = false;
- let same_drive: bool = Project.raw.envmap != null ? Project.filepath.charAt(0) == Project.raw.envmap.charAt(0) : true;
+ let same_drive: bool = project_raw.envmap != null ? project_filepath.charAt(0) == project_raw.envmap.charAt(0) : true;
- Project.raw = {
+ project_raw = {
version: manifest_version,
material_groups: mgroups,
assets: texture_files,
packed_assets: packed_assets,
- swatches: Project.raw.swatches,
- envmap: Project.raw.envmap != null ? (same_drive ? Path.to_relative(Project.filepath, Project.raw.envmap) : Project.raw.envmap) : null,
+ swatches: project_raw.swatches,
+ envmap: project_raw.envmap != null ? (same_drive ? path_to_relative(project_filepath, project_raw.envmap) : project_raw.envmap) : null,
envmap_strength: scene_world.strength,
camera_world: mat4_to_f32_array(scene_camera.base.transform.local),
- camera_origin: ExportArm.vec3f32(Camera.origins[0]),
+ camera_origin: ExportArm.vec3f32(camera_origins[0]),
camera_fov: scene_camera.data.fov,
@@ -121,8 +121,8 @@ class ExportArm {
- atlas_objects: Project.atlas_objects,
- atlas_names: Project.atlas_names,
+ atlas_objects: project_atlas_objects,
+ atlas_names: project_atlas_names,
@@ -138,7 +138,7 @@ class ExportArm {
};
- let tex: image_t = render_path_render_targets.get(Context.raw.render_mode == render_mode_t.FORWARD ? "buf" : "tex")._image;
+ let tex: image_t = render_path_render_targets.get(context_raw.render_mode == render_mode_t.FORWARD ? "buf" : "tex")._image;
let mesh_icon: image_t = image_create_render_target(256, 256);
let r: f32 = app_w() / app_h();
g2_begin(mesh_icon);
@@ -164,37 +164,37 @@ class ExportArm {
image_unload(mesh_icon);
- // Project.raw.mesh_icons =
+ // raw.mesh_icons =
// [encode(bgraSwap(mesh_icon_pixels)];
// [encode(mesh_icon_pixels)];
- krom_write_png(Project.filepath.substr(0, Project.filepath.length - 4) + "_icon.png", mesh_icon_pixels, 256, 256, 0);
+ krom_write_png(project_filepath.substr(0, project_filepath.length - 4) + "_icon.png", mesh_icon_pixels, 256, 256, 0);
- let is_packed: bool = Project.filepath.endsWith("_packed_.arm");
+ let is_packed: bool = project_filepath.endsWith("_packed_.arm");
if (is_packed) { // Pack textures
- ExportArm.pack_assets(Project.raw, Project.assets);
+ ExportArm.pack_assets(project_raw, project_assets);
- let buffer: buffer_t = armpack_encode(Project.raw);
- krom_file_save_bytes(Project.filepath, buffer, buffer.byteLength + 1);
+ let buffer: buffer_t = armpack_encode(project_raw);
+ krom_file_save_bytes(project_filepath, buffer, buffer.byteLength + 1);
// Save to recent
- let recent_path: string = Project.filepath.substr(Project.filepath.lastIndexOf("/") + 1);
+ let recent_path: string = project_filepath.substr(project_filepath.lastIndexOf("/") + 1);
- let recent_path: string = Project.filepath;
+ let recent_path: string = project_filepath;
- let recent: string[] = Config.raw.recent_projects;
+ let recent: string[] = config_raw.recent_projects;
array_remove(recent, recent_path);
recent.unshift(recent_path);
- Console.info(tr("Project saved"));
+ console_info(tr("Project saved"));
static texture_node_name = (): string => {
@@ -211,7 +211,7 @@ class ExportArm {
n.buttons[0].data = base_enum_texts(n.type)[index];
if (assets != null) {
if (assets.indexOf(asset) == -1) {
assets.push(asset);
@@ -228,7 +228,7 @@ class ExportArm {
if (!path.endsWith(".arm")) path += ".arm";
- let m: SlotMaterialRaw = Context.raw.material;
+ let m: SlotMaterialRaw = context_raw.material;
let assets: asset_t[] = [];
if (UINodes.has_group(c)) {
@@ -243,7 +243,7 @@ class ExportArm {
let is_cloud: bool = path.endsWith("_cloud_.arm");
if (is_cloud) path = string_replace_all(path, "_cloud_", "");
let packed_assets: packed_asset_t[] = null;
- if (!Context.raw.pack_assets_on_export) {
+ if (!context_raw.pack_assets_on_export) {
packed_assets = ExportArm.get_packed_assets(path, texture_files);
@@ -261,14 +261,14 @@ class ExportArm {
packed_assets: packed_assets
- if (Context.raw.write_icon_on_export) { // Separate icon files
+ if (context_raw.write_icon_on_export) { // Separate icon files
krom_write_png(path.substr(0, path.length - 4) + "_icon.png", image_get_pixels(m.image), m.image.width, m.image.height, 0);
if (is_cloud) {
krom_write_jpg(path.substr(0, path.length - 4) + "_icon.jpg", image_get_pixels(m.image), m.image.width, m.image.height, 0, 50);
- if (Context.raw.pack_assets_on_export) { // Pack textures
+ if (context_raw.pack_assets_on_export) { // Pack textures
ExportArm.pack_assets(raw, assets);
@@ -293,7 +293,7 @@ class ExportArm {
static run_brush = (path: string) => {
- let b: SlotBrushRaw = Context.raw.brush;
+ let b: SlotBrushRaw = context_raw.brush;
let c: zui_node_canvas_t = JSON.parse(JSON.stringify(b.canvas));
for (let n of c.nodes) ExportArm.export_node(n, assets);
@@ -303,7 +303,7 @@ class ExportArm {
@@ -320,11 +320,11 @@ class ExportArm {
- if (Context.raw.write_icon_on_export) { // Separate icon file
+ if (context_raw.write_icon_on_export) { // Separate icon file
krom_write_png(path.substr(0, path.length - 4) + "_icon.png", image_get_pixels(b.image), b.image.width, b.image.height, 0);
@@ -343,7 +343,7 @@ class ExportArm {
// Convert image path from absolute to relative
if (same_drive) {
- texture_files.push(Path.to_relative(projectPath, a.file));
+ texture_files.push(path_to_relative(projectPath, a.file));
texture_files.push(a.file);
@@ -355,7 +355,7 @@ class ExportArm {
static meshes_to_files = (projectPath: string): string[] => {
let mesh_files: string[] = [];
- for (let file of Project.mesh_assets) {
+ for (let file of project_mesh_assets) {
@@ -363,7 +363,7 @@ class ExportArm {
// Convert mesh path from absolute to relative
- mesh_files.push(Path.to_relative(projectPath, file));
+ mesh_files.push(path_to_relative(projectPath, file));
mesh_files.push(file);
@@ -383,7 +383,7 @@ class ExportArm {
// Convert font path from absolute to relative
- font_files.push(Path.to_relative(projectPath, f.file));
+ font_files.push(path_to_relative(projectPath, f.file));
font_files.push(f.file);
@@ -395,15 +395,15 @@ class ExportArm {
static get_packed_assets = (projectPath: string, texture_files: string[]): packed_asset_t[] => {
- if (Project.raw.packed_assets != null) {
- for (let pa of Project.raw.packed_assets) {
+ if (project_raw.packed_assets != null) {
+ for (let pa of project_raw.packed_assets) {
let same_drive: bool = projectPath.charAt(0) == pa.name.charAt(0);
// Convert path from absolute to relative
- pa.name = same_drive ? Path.to_relative(projectPath, pa.name) : pa.name;
+ pa.name = same_drive ? path_to_relative(projectPath, pa.name) : pa.name;
for (let tf of texture_files) {
if (pa.name == tf) {
if (packed_assets == null) {
@@ -424,8 +424,8 @@ class ExportArm {
let temp_images: image_t[] = [];
for (let i: i32 = 0; i < assets.length; ++i) {
- if (!Project.packed_asset_exists(raw.packed_assets, assets[i].file)) {
- let image: image_t = Project.get_image(assets[i]);
+ if (!project_packed_asset_exists(raw.packed_assets, assets[i].file)) {
+ let image: image_t = project_get_image(assets[i]);
let temp: image_t = image_create_render_target(image.width, image.height);
g2_begin(temp);
g2_draw_image(image, 0, 0);
@@ -448,7 +448,7 @@ class ExportArm {
let raw: any = {
- swatches: Project.raw.swatches
+ swatches: project_raw.swatches
let buffer: buffer_t = armpack_encode(raw);
krom_file_save_bytes(path, buffer, buffer.byteLength + 1);
@@ -2,8 +2,8 @@
class ExportMesh {
static run = (path: string, paintObjects: mesh_object_t[] = null, applyDisplacement: bool = false) => {
- if (paintObjects == null) paintObjects = Project.paint_objects;
- if (Context.raw.export_mesh_format == mesh_format_t.OBJ) ExportObj.run(path, paintObjects, applyDisplacement);
+ if (paintObjects == null) paintObjects = project_paint_objects;
+ if (context_raw.export_mesh_format == mesh_format_t.OBJ) ExportObj.run(path, paintObjects, applyDisplacement);
else ExportArm.run_mesh(path, paintObjects);
@@ -89,8 +89,8 @@ class ExportObj {
if (applyDisplacement) {
- // let height: buffer_t = Project.layers[0].texpaint_pack.getPixels();
- // let res: i32 = Project.layers[0].texpaint_pack.width;
+ // let height: buffer_t = layers[0].texpaint_pack.getPixels();
+ // let res: i32 = layers[0].texpaint_pack.width;
// let strength: f32 = 0.1;
// for (let i: i32 = 0; i < len; ++i) {
// let x: i32 = Math.floor(texa2[i * 2 ] / 32767 * res);
@@ -11,62 +11,62 @@ class ExportTexture {
if (bake_material) {
ExportTexture.run_bake_material(path);
- else if (Context.raw.layers_export == export_mode_t.PER_UDIM_TILE) {
+ else if (context_raw.layers_export == export_mode_t.PER_UDIM_TILE) {
let udim_tiles: string[] = [];
- let name: string = Project.paint_objects[SlotLayer.get_object_mask(l) - 1].base.name;
+ let name: string = project_paint_objects[SlotLayer.get_object_mask(l) - 1].base.name;
if (name.substr(name.length - 5, 2) == ".1") { // tile.1001
udim_tiles.push(name.substr(name.length - 5));
if (udim_tiles.length > 0) {
- for (let udim_tile of udim_tiles) ExportTexture.run_layers(path, Project.layers, udim_tile);
+ for (let udim_tile of udim_tiles) ExportTexture.run_layers(path, project_layers, udim_tile);
- else ExportTexture.run_layers(path, Project.layers);
+ else ExportTexture.run_layers(path, project_layers);
- else if (Context.raw.layers_export == export_mode_t.PER_OBJECT) {
+ else if (context_raw.layers_export == export_mode_t.PER_OBJECT) {
let object_names: string[] = [];
if (object_names.indexOf(name) == -1) {
object_names.push(name);
if (object_names.length > 0) {
- for (let name of object_names) ExportTexture.run_layers(path, Project.layers, name);
+ for (let name of object_names) ExportTexture.run_layers(path, project_layers, name);
else { // Visible or selected
let atlas_export: bool = false;
- if (Project.atlas_objects != null) {
- for (let i: i32 = 1; i < Project.atlas_objects.length; ++i) {
- if (Project.atlas_objects[i - 1] != Project.atlas_objects[i]) {
+ if (project_atlas_objects != null) {
+ for (let i: i32 = 1; i < project_atlas_objects.length; ++i) {
+ if (project_atlas_objects[i - 1] != project_atlas_objects[i]) {
atlas_export = true;
if (atlas_export) {
- for (let atlas_index: i32 = 0; atlas_index < Project.atlas_objects.length; ++atlas_index) {
+ for (let atlas_index: i32 = 0; atlas_index < project_atlas_objects.length; ++atlas_index) {
- for (let object_index: i32 = 0; object_index < Project.atlas_objects.length; ++object_index) {
- if (Project.atlas_objects[object_index] == atlas_index) {
+ for (let object_index: i32 = 0; object_index < project_atlas_objects.length; ++object_index) {
+ if (project_atlas_objects[object_index] == atlas_index) {
if (SlotLayer.get_object_mask(l) == 0 /* shared object */ || SlotLayer.get_object_mask(l) - 1 == object_index) layers.push(l);
if (layers.length > 0) {
- ExportTexture.run_layers(path, layers, Project.atlas_names[atlas_index]);
+ ExportTexture.run_layers(path, layers, project_atlas_names[atlas_index]);
- else ExportTexture.run_layers(path, Context.raw.layers_export == export_mode_t.SELECTED ? (SlotLayer.is_group(Context.raw.layer) ? SlotLayer.get_children(Context.raw.layer) : [Context.raw.layer]) : Project.layers);
+ else ExportTexture.run_layers(path, context_raw.layers_export == export_mode_t.SELECTED ? (SlotLayer.is_group(context_raw.layer) ? SlotLayer.get_children(context_raw.layer) : [context_raw.layer]) : project_layers);
@@ -75,11 +75,11 @@ class ExportTexture {
- Console.info(tr("Textures exported") + " ('Files/On My iPad/" + manifest_title + "')");
+ console_info(tr("Textures exported") + " ('Files/On My iPad/" + manifest_title + "')");
///elseif krom_android
- Console.info(tr("Textures exported") + " ('Files/Internal storage/Pictures/" + manifest_title + "')");
+ console_info(tr("Textures exported") + " ('Files/Internal storage/Pictures/" + manifest_title + "')");
- Console.info(tr("Textures exported"));
+ console_info(tr("Textures exported"));
UIFiles.last_path = "";
@@ -90,22 +90,22 @@ class ExportTexture {
- Context.raw.tool = workspace_tool_t.FILL;
+ context_raw.tool = workspace_tool_t.FILL;
let planeo: mesh_object_t = scene_get_child(".Plane").ext;
planeo.base.visible = true;
- Context.raw.paint_object = planeo;
+ context_raw.paint_object = planeo;
planeo.base.visible = false;
- Context.raw.paint_object = _paint_object;
+ context_raw.paint_object = _paint_object;
ExportTexture.run_layers(path, [RenderPathPaint.live_layer], "", true);
@@ -119,21 +119,21 @@ class ExportTexture {
static run_layers = (path: string, layers: any[], object_name: string = "") => {
- let texture_size_x: i32 = Config.get_texture_res_x();
- let texture_size_y: i32 = Config.get_texture_res_y();
+ let texture_size_x: i32 = config_get_texture_res_x();
+ let texture_size_y: i32 = config_get_texture_res_y();
- let format_type: texture_ldr_format_t = Context.raw.format_type;
+ let format_type: texture_ldr_format_t = context_raw.format_type;
let bits: i32 = base_bits_handle.position == texture_bits_t.BITS8 ? 8 : 16;
let ext: string = bits == 16 ? ".exr" : format_type == texture_ldr_format_t.PNG ? ".png" : ".jpg";
if (f.endsWith(ext)) f = f.substr(0, f.length - 4);
- let is_udim: bool = Context.raw.layers_export == export_mode_t.PER_UDIM_TILE;
+ let is_udim: bool = context_raw.layers_export == export_mode_t.PER_UDIM_TILE;
if (is_udim) ext = object_name + ext;
@@ -143,9 +143,9 @@ class ExportTexture {
let empty: image_t = render_path_render_targets.get("empty_white")._image;
// Append object mask name
- let export_selected: bool = Context.raw.layers_export == export_mode_t.SELECTED;
+ let export_selected: bool = context_raw.layers_export == export_mode_t.SELECTED;
if (export_selected && SlotLayer.get_object_mask(layers[0]) > 0) {
- f += "_" + Project.paint_objects[SlotLayer.get_object_mask(layers[0]) - 1].base.name;
+ f += "_" + project_paint_objects[SlotLayer.get_object_mask(layers[0]) - 1].base.name;
if (!is_udim && !export_selected && object_name != "") {
f += "_" + object_name;
@@ -168,9 +168,9 @@ class ExportTexture {
if (!SlotLayer.is_layer(l1)) continue;
if (object_name != "" && SlotLayer.get_object_mask(l1) > 0) {
- if (is_udim && !Project.paint_objects[SlotLayer.get_object_mask(l1) - 1].base.name.endsWith(object_name)) continue;
- let per_object: bool = Context.raw.layers_export == export_mode_t.PER_OBJECT;
- if (per_object && Project.paint_objects[SlotLayer.get_object_mask(l1) - 1].base.name != object_name) continue;
+ if (is_udim && !project_paint_objects[SlotLayer.get_object_mask(l1) - 1].base.name.endsWith(object_name)) continue;
+ let per_object: bool = context_raw.layers_export == export_mode_t.PER_OBJECT;
+ if (per_object && project_paint_objects[SlotLayer.get_object_mask(l1) - 1].base.name != object_name) continue;
let mask: image_t = empty;
@@ -292,28 +292,28 @@ class ExportTexture {
let tex_name = t.name != "" ? "_" + t.name : "";
let single_channel: bool = c[0] == c[1] && c[1] == c[2] && c[3] == "1.0";
if (c[0] == "base_r" && c[1] == "base_g" && c[2] == "base_b" && c[3] == "1.0" && t.color_space == "linear") {
- ExportTexture.write_texture(path + Path.sep + f + tex_name + ext, pixpaint, 1);
+ ExportTexture.write_texture(path + path_sep + f + tex_name + ext, pixpaint, 1);
else if (c[0] == "nor_r" && c[1] == "nor_g" && c[2] == "nor_b" && c[3] == "1.0" && t.color_space == "linear") {
- ExportTexture.write_texture(path + Path.sep + f + tex_name + ext, pixpaint_nor, 1);
+ ExportTexture.write_texture(path + path_sep + f + tex_name + ext, pixpaint_nor, 1);
else if (c[0] == "occ" && c[1] == "rough" && c[2] == "metal" && c[3] == "1.0" && t.color_space == "linear") {
- ExportTexture.write_texture(path + Path.sep + f + tex_name + ext, pixpaint_pack, 1);
+ ExportTexture.write_texture(path + path_sep + f + tex_name + ext, pixpaint_pack, 1);
else if (single_channel && c[0] == "occ" && t.color_space == "linear") {
- ExportTexture.write_texture(path + Path.sep + f + tex_name + ext, pixpaint_pack, 2, 0);
+ ExportTexture.write_texture(path + path_sep + f + tex_name + ext, pixpaint_pack, 2, 0);
else if (single_channel && c[0] == "rough" && t.color_space == "linear") {
- ExportTexture.write_texture(path + Path.sep + f + tex_name + ext, pixpaint_pack, 2, 1);
+ ExportTexture.write_texture(path + path_sep + f + tex_name + ext, pixpaint_pack, 2, 1);
else if (single_channel && c[0] == "metal" && t.color_space == "linear") {
- ExportTexture.write_texture(path + Path.sep + f + tex_name + ext, pixpaint_pack, 2, 2);
+ ExportTexture.write_texture(path + path_sep + f + tex_name + ext, pixpaint_pack, 2, 2);
else if (single_channel && c[0] == "height" && t.color_space == "linear") {
- ExportTexture.write_texture(path + Path.sep + f + tex_name + ext, pixpaint_pack, 2, 3);
+ ExportTexture.write_texture(path + path_sep + f + tex_name + ext, pixpaint_pack, 2, 3);
else if (single_channel && c[0] == "opac" && t.color_space == "linear") {
- ExportTexture.write_texture(path + Path.sep + f + tex_name + ext, pixpaint, 2, 3);
+ ExportTexture.write_texture(path + path_sep + f + tex_name + ext, pixpaint, 2, 3);
if (pix == null) pix = new ArrayBuffer(texture_size_x * texture_size_y * 4 * Math.floor(bits / 8));
@@ -337,7 +337,7 @@ class ExportTexture {
else if (c == "0.0") ExportTexture.set_channel(0, new DataView(pix), i);
else if (c == "1.0") ExportTexture.set_channel(255, new DataView(pix), i);
- ExportTexture.write_texture(path + Path.sep + f + tex_name + ext, pix, 3);
+ ExportTexture.write_texture(path + path_sep + f + tex_name + ext, pix, 3);
@@ -348,8 +348,8 @@ class ExportTexture {
static write_texture = (file: string, pixels: ArrayBuffer, type: i32 = 1, off: i32 = 0) => {
let bits_handle: i32 = base_bits_handle.position;
let bits: i32 = bits_handle == texture_bits_t.BITS8 ? 8 : bits_handle == texture_bits_t.BITS16 ? 16 : 32;
let format: i32 = 0; // RGBA
@@ -359,26 +359,26 @@ class ExportTexture {
if (type == 2 && off == 2) format = 5; // BBB1
if (type == 2 && off == 3) format = 6; // AAA1
let image: image_t = image_from_bytes(pixels, res_x, res_y);
data_cached_images.set(file, image);
- let ar: string[] = file.split(Path.sep);
+ let ar: string[] = file.split(path_sep);
let name: string = ar[ar.length - 1];
- let asset: asset_t = {name: name, file: file, id: Project.asset_id++};
- Project.assets.push(asset);
- if (Project.raw.assets == null) Project.raw.assets = [];
- Project.raw.assets.push(asset.file);
- Project.asset_names.push(asset.name);
- Project.asset_map.set(asset.id, image);
- ExportArm.pack_assets(Project.raw, [asset]);
+ let asset: asset_t = {name: name, file: file, id: project_asset_id++};
+ project_assets.push(asset);
+ if (project_raw.assets == null) project_raw.assets = [];
+ project_raw.assets.push(asset.file);
+ project_asset_names.push(asset.name);
+ project_asset_map.set(asset.id, image);
+ ExportArm.pack_assets(project_raw, [asset]);
- if (bits == 8 && Context.raw.format_type == texture_ldr_format_t.PNG) {
+ if (bits == 8 && context_raw.format_type == texture_ldr_format_t.PNG) {
krom_write_png(file, pixels, res_x, res_y, format);
- else if (bits == 8 && Context.raw.format_type == texture_ldr_format_t.JPG) {
- krom_write_jpg(file, pixels, res_x, res_y, format, Math.floor(Context.raw.format_quality));
+ else if (bits == 8 && context_raw.format_type == texture_ldr_format_t.JPG) {
+ krom_write_jpg(file, pixels, res_x, res_y, format, Math.floor(context_raw.format_quality));
else { // Exr
let b: ArrayBuffer = ParserExr.run(res_x, res_y, pixels, bits, type, off);
@@ -1,199 +0,0 @@
-class File {
- ///if krom_windows
- static cmd_mkdir: string = "mkdir";
- static cmd_copy: string = "copy";
- static cmd_mkdir: string = "mkdir -p";
- static cmd_copy: string = "cp";
- static cloud: Map<string, string[]> = null;
- static cloud_sizes: Map<string, i32> = null;
- // ///if krom_android
- // static let internal: Map<string, string[]> = null; // .apk contents
- // ///end
- static read_directory = (path: string, folders_only: bool = false): string[] => {
- if (path.startsWith("cloud")) {
- let files: string[] = File.cloud != null ? File.cloud.get(string_replace_all(path, "\\", "/")) : null;
- return files != null ? files : [];
- // path = string_replace_all(path, "//", "/");
- // if (internal == null) {
- // internal = [];
- // internal.set("/data/plugins", BuildMacros.readDirectory("krom/data/plugins"));
- // internal.set("/data/export_presets", BuildMacros.readDirectory("krom/data/export_presets"));
- // internal.set("/data/keymap_presets", BuildMacros.readDirectory("krom/data/keymap_presets"));
- // internal.set("/data/locale", BuildMacros.readDirectory("krom/data/locale"));
- // internal.set("/data/meshes", BuildMacros.readDirectory("krom/data/meshes"));
- // internal.set("/data/themes", BuildMacros.readDirectory("krom/data/themes"));
- // if (internal.exists(path)) return internal.get(path);
- return krom_read_directory(path, folders_only).split("\n");
- static create_directory = (path: string) => {
- krom_sys_command(File.cmd_mkdir + ' "' + path + '"');
- static copy = (srcPath: string, dst_path: string) => {
- krom_sys_command(File.cmd_copy + ' "' + srcPath + '" "' + dst_path + '"');
- static start = (path: string) => {
- krom_sys_command('start "" "' + path + '"');
- ///elseif krom_linux
- krom_sys_command('xdg-open "' + path + '"');
- krom_sys_command('open "' + path + '"');
- static load_url = (url: string) => {
- krom_load_url(url);
- static delete = (path: string) => {
- krom_delete_file(path);
- static exists = (path: string): bool => {
- return krom_file_exists(path);
- static download = (url: string, dstPath: string, done: ()=>void, size: i32 = 0) => {
- ///if (krom_windows || krom_darwin || krom_ios || krom_android)
- krom_http_request(url, size, (ab: ArrayBuffer) => {
- if (ab != null) krom_file_save_bytes(dstPath, ab);
- krom_sys_command('wget -O "' + dstPath + '" "' + url + '"');
- krom_sys_command('curl -L ' + url + ' -o "' + dstPath + '"');
- static download_bytes = (url: string, done: (ab: ArrayBuffer)=>void) => {
- let save: string = (Path.is_protected() ? krom_save_path() : Path.data() + Path.sep) + "download.bin";
- File.download(url, save, () => {
- let buffer: ArrayBuffer = null;
- buffer = krom_load_blob(save);
- catch (e: any) {}
- done(buffer);
- static cache_cloud = (path: string, done: (s: string)=>void) => {
- let path2: string = string_replace_all(path, "/", "_"); // Cache everything into root folder
- let path2: string = path;
- let dest: string = (Path.is_protected() ? krom_save_path() : krom_get_files_location() + Path.sep) + path2;
- if (File.exists(dest)) {
- ///if (krom_darwin || krom_ios)
- done(dest);
- done((Path.is_protected() ? krom_save_path() : Path.working_dir() + Path.sep) + path);
- let file_dir: string = dest.substr(0, dest.lastIndexOf(Path.sep));
- if (File.read_directory(file_dir)[0] == "") {
- File.create_directory(file_dir);
- path = string_replace_all(path, "\\", "/");
- let url: string = Config.raw.server + "/" + path;
- File.download(url, dest, () => {
- if (!File.exists(dest)) {
- Console.error(Strings.error5());
- done(null);
- }, File.cloud_sizes.get(path));
- static init_cloud_bytes = (done: ()=>void, append: string = "") => {
- File.download_bytes(Config.raw.server + "/?list-type=2" + append, (buffer: ArrayBuffer) => {
- if (buffer == null) {
- File.cloud.set("cloud", []);
- let files: string[] = [];
- let sizes: i32[] = [];
- let str: string = sys_buffer_to_string(buffer);
- let pos_start: i32 = 0;
- let pos_end: i32 = 0;
- while (true) {
- pos_start = str.indexOf("<Key>", pos_start);
- if (pos_start == -1) break;
- pos_start += 5; // <Key>
- pos_end = str.indexOf("</Key>", pos_start);
- files.push(str.substring(pos_start, pos_end));
- pos_start = str.indexOf("<Size>", pos_end);
- pos_start += 6; //<Size>
- pos_end = str.indexOf("</Size>", pos_start);
- sizes.push(Number(str.substring(pos_start, pos_end)));
- for (let file of files) {
- if (Path.is_folder(file)) {
- File.cloud.set(file.substr(0, file.length - 1), []);
- for (let i: i32 = 0; i < files.length; ++i) {
- let file: string = files[i];
- let nested: bool = file.indexOf("/") != file.lastIndexOf("/");
- if (nested) {
- let delim: i32 = Path.is_folder(file) ? file.substr(0, file.length - 1).lastIndexOf("/") : file.lastIndexOf("/");
- let parent: string = file.substr(0, delim);
- let child: string = Path.is_folder(file) ? file.substring(delim + 1, file.length - 1) : file.substr(delim + 1);
- File.cloud.get(parent).push(child);
- if (!Path.is_folder(file)) {
- File.cloud_sizes.set(file, sizes[i]);
- let is_truncated: bool = str.indexOf("<IsTruncated>true") > -1;
- if (is_truncated) {
- let pos_start: i32 = str.indexOf("<NextContinuationToken>");
- pos_start += 23;
- let pos_end: i32 = str.indexOf("</NextContinuationToken>", pos_start);
- File.init_cloud_bytes(done, "&start-after=" + str.substring(pos_start, pos_end));
- else done();
- static init_cloud = (done: ()=>void) => {
- File.cloud = new Map();
- File.cloud_sizes = new Map();
- File.init_cloud_bytes(done);
@@ -1,139 +0,0 @@
-class Geom {
- static make_plane(size_x: f32 = 1.0, size_y: f32 = 1.0, verts_x: i32 = 2, verts_y: i32 = 2, uv_scale: f32 = 1.0): raw_mesh_t {
- let mesh: raw_mesh_t = {};
- mesh.scalePos = 1.0;
- mesh.scaleTex = 1.0;
- mesh.name = "";
- mesh.hasNext = false;
- // Pack positions to (-1, 1) range
- let half_x: f32 = size_x / 2;
- let half_y: f32 = size_y / 2;
- mesh.scalePos = Math.max(half_x, half_y);
- let inv: f32 = (1 / mesh.scalePos) * 32767;
- mesh.posa = new Int16Array(verts_x * verts_y * 4);
- mesh.nora = new Int16Array(verts_x * verts_y * 2);
- mesh.texa = new Int16Array(verts_x * verts_y * 2);
- mesh.inda = new Uint32Array((verts_x - 1) * (verts_y - 1) * 6);
- let step_x: f32 = size_x / (verts_x - 1);
- let step_y: f32 = size_y / (verts_y - 1);
- for (let i: i32 = 0; i < verts_x * verts_y; ++i) {
- let x: f32 = (i % verts_x) * step_x - half_x;
- let y: f32 = Math.floor(i / verts_x) * step_y - half_y;
- mesh.posa[i * 4 ] = Math.floor(x * inv);
- mesh.posa[i * 4 + 1] = Math.floor(y * inv);
- mesh.posa[i * 4 + 2] = 0;
- mesh.nora[i * 2 ] = 0;
- mesh.nora[i * 2 + 1] = 0;
- mesh.posa[i * 4 + 3] = 32767;
- x = (i % verts_x) / (verts_x - 1);
- y = 1.0 - Math.floor(i / verts_x) / (verts_y - 1);
- mesh.texa[i * 2 ] = (Math.floor(x * 32767 * uv_scale) - 1) % 32767;
- mesh.texa[i * 2 + 1] = (Math.floor(y * 32767 * uv_scale) - 1) % 32767;
- for (let i: i32 = 0; i < (verts_x - 1) * (verts_y - 1); ++i) {
- let x: f32 = i % (verts_x - 1);
- let y: f32 = Math.floor(i / (verts_y - 1));
- mesh.inda[i * 6 ] = y * verts_x + x;
- mesh.inda[i * 6 + 1] = y * verts_x + x + 1;
- mesh.inda[i * 6 + 2] = (y + 1) * verts_x + x;
- mesh.inda[i * 6 + 3] = y * verts_x + x + 1;
- mesh.inda[i * 6 + 4] = (y + 1) * verts_x + x + 1;
- mesh.inda[i * 6 + 5] = (y + 1) * verts_x + x;
- return mesh;
- static make_uv_sphere(radius: f32 = 1.0, widthSegments: i32 = 32, heightSegments: i32 = 16, stretch_uv: bool = true, uvScale: f32 = 1.0): raw_mesh_t {
- mesh.scalePos = radius;
- mesh.scaleTex = uvScale;
- let pi2: f32 = Math.PI * 2;
- let width_verts: i32 = widthSegments + 1;
- let height_verts: i32 = heightSegments + 1;
- mesh.posa = new Int16Array(width_verts * height_verts * 4);
- mesh.nora = new Int16Array(width_verts * height_verts * 2);
- mesh.texa = new Int16Array(width_verts * height_verts * 2);
- mesh.inda = new Uint32Array(widthSegments * heightSegments * 6 - widthSegments * 6);
- let nor: vec4_t = vec4_create();
- let pos: i32 = 0;
- for (let y: i32 = 0; y < height_verts; ++y) {
- let v: f32 = y / heightSegments;
- let v_flip: f32 = 1.0 - v;
- if (!stretch_uv) v_flip /= 2;
- let u_off: f32 = y == 0 ? 0.5 / widthSegments : y == heightSegments ? -0.5 / widthSegments : 0.0;
- for (let x: i32 = 0; x < width_verts; ++x) {
- let u: f32 = x / widthSegments;
- let u_pi2: f32 = u * pi2;
- let v_pi: f32 = v * Math.PI;
- let v_pi_sin: f32 = Math.sin(v_pi);
- let vx: f32 = -radius * Math.cos(u_pi2) * v_pi_sin;
- let vy: f32 = radius * Math.sin(u_pi2) * v_pi_sin;
- let vz: f32 = -radius * Math.cos(v_pi);
- let i4: i32 = pos * 4;
- let i2: i32 = pos * 2;
- mesh.posa[i4 ] = Math.floor(vx * inv);
- mesh.posa[i4 + 1] = Math.floor(vy * inv);
- mesh.posa[i4 + 2] = Math.floor(vz * inv);
- vec4_normalize(vec4_set(nor, vx, vy, vz));
- mesh.posa[i4 + 3] = Math.floor(nor.z * 32767);
- mesh.nora[i2 ] = Math.floor(nor.x * 32767);
- mesh.nora[i2 + 1] = Math.floor(nor.y * 32767);
- mesh.texa[i2 ] = (Math.floor((u + u_off) * 32767) - 1) % 32767;
- mesh.texa[i2 + 1] = (Math.floor(v_flip * 32767) - 1) % 32767;
- pos++;
- pos = 0;
- let height_segments1: i32 = heightSegments - 1;
- for (let y: i32 = 0; y < heightSegments; ++y) {
- for (let x: i32 = 0; x < widthSegments; ++x) {
- let x1: i32 = x + 1;
- let y1: i32 = y + 1;
- let a: f32 = y * width_verts + x1;
- let b: f32 = y * width_verts + x;
- let c: f32 = y1 * width_verts + x;
- let d: f32 = y1 * width_verts + x1;
- if (y > 0) {
- mesh.inda[pos++] = a;
- mesh.inda[pos++] = b;
- mesh.inda[pos++] = d;
- if (y < height_segments1) {
- mesh.inda[pos++] = c;
-type raw_mesh_t = {
- posa?: Int16Array;
- nora?: Int16Array;
- texa?: Int16Array;
- inda?: Uint32Array;
- scalePos?: f32;
- scaleTex?: f32;
- name?: string;
- hasNext?: bool;
-};
@@ -1,268 +0,0 @@
-///if (is_paint || is_sculpt)
-class Gizmo {
- static v: vec4_t = vec4_create();
- static v0: vec4_t = vec4_create();
- static q: quat_t = quat_create();
- static q0: quat_t = quat_create();
- let is_object: bool = Context.raw.tool == workspace_tool_t.GIZMO;
- let is_decal: bool = base_is_decal_layer();
- let gizmo: object_t = Context.raw.gizmo;
- let hide: bool = Operator.shortcut(Config.keymap.stencil_hide, ShortcutType.ShortcutDown);
- gizmo.visible = (is_object || is_decal) && !hide;
- if (!gizmo.visible) return;
- let paint_object: object_t = Context.raw.paint_object.base;
- ///if is_forge
- paint_object = Context.raw.selected_object;
- if (is_object) {
- vec4_set_from(gizmo.transform.loc, paint_object.transform.loc);
- else if (is_decal) {
- vec4_set(gizmo.transform.loc, Context.raw.layer.decal_mat.m[12], Context.raw.layer.decal_mat.m[13], Context.raw.layer.decal_mat.m[14]);
- let cam: camera_object_t = scene_camera;
- let fov: f32 = cam.data.fov;
- let dist: f32 = vec4_dist(cam.base.transform.loc, gizmo.transform.loc) / 8 * fov;
- vec4_set(gizmo.transform.scale, dist, dist, dist);
- vec4_set(Context.raw.gizmo_translate_x.transform.scale, dist, dist, dist);
- vec4_set(Context.raw.gizmo_translate_y.transform.scale, dist, dist, dist);
- vec4_set(Context.raw.gizmo_translate_z.transform.scale, dist, dist, dist);
- vec4_set(Context.raw.gizmo_scale_x.transform.scale, dist, dist, dist);
- vec4_set(Context.raw.gizmo_scale_y.transform.scale, dist, dist, dist);
- vec4_set(Context.raw.gizmo_scale_z.transform.scale, dist, dist, dist);
- vec4_set(Context.raw.gizmo_rotate_x.transform.scale, dist, dist, dist);
- vec4_set(Context.raw.gizmo_rotate_y.transform.scale, dist, dist, dist);
- vec4_set(Context.raw.gizmo_rotate_z.transform.scale, dist, dist, dist);
- transform_build_matrix(gizmo.transform);
- // Scene control
- if (Context.raw.translate_x || Context.raw.translate_y || Context.raw.translate_z || Context.raw.scale_x || Context.raw.scale_y || Context.raw.scale_z || Context.raw.rotate_x || Context.raw.rotate_y || Context.raw.rotate_z) {
- if (Context.raw.translate_x) {
- paint_object.transform.loc.x = Context.raw.gizmo_drag;
- else if (Context.raw.translate_y) {
- paint_object.transform.loc.y = Context.raw.gizmo_drag;
- else if (Context.raw.translate_z) {
- paint_object.transform.loc.z = Context.raw.gizmo_drag;
- else if (Context.raw.scale_x) {
- paint_object.transform.scale.x += Context.raw.gizmo_drag - Context.raw.gizmo_drag_last;
- else if (Context.raw.scale_y) {
- paint_object.transform.scale.y += Context.raw.gizmo_drag - Context.raw.gizmo_drag_last;
- else if (Context.raw.scale_z) {
- paint_object.transform.scale.z += Context.raw.gizmo_drag - Context.raw.gizmo_drag_last;
- else if (Context.raw.rotate_x) {
- quat_from_axis_angle(Gizmo.q0, vec4_x_axis(), Context.raw.gizmo_drag - Context.raw.gizmo_drag_last);
- quat_mult(paint_object.transform.rot, Gizmo.q0);
- else if (Context.raw.rotate_y) {
- quat_from_axis_angle(Gizmo.q0, vec4_y_axis(), Context.raw.gizmo_drag - Context.raw.gizmo_drag_last);
- else if (Context.raw.rotate_z) {
- quat_from_axis_angle(Gizmo.q0, vec4_z_axis(), Context.raw.gizmo_drag - Context.raw.gizmo_drag_last);
- Context.raw.gizmo_drag_last = Context.raw.gizmo_drag;
- transform_build_matrix(paint_object.transform);
- ///if arm_physics
- let pb: any = (paint_object as any).physicsBody;
- if (pb != null) pb.syncTransform();
- // Decal layer control
- Context.raw.layer.decal_mat.m[12] = Context.raw.gizmo_drag;
- Context.raw.layer.decal_mat.m[13] = Context.raw.gizmo_drag;
- Context.raw.layer.decal_mat.m[14] = Context.raw.gizmo_drag;
- mat4_decompose(Context.raw.layer.decal_mat, Gizmo.v, Gizmo.q, Gizmo.v0);
- Gizmo.v0.x += Context.raw.gizmo_drag - Context.raw.gizmo_drag_last;
- mat4_compose(Context.raw.layer.decal_mat, Gizmo.v, Gizmo.q, Gizmo.v0);
- Gizmo.v0.y += Context.raw.gizmo_drag - Context.raw.gizmo_drag_last;
- Gizmo.v0.z += Context.raw.gizmo_drag - Context.raw.gizmo_drag_last;
- quat_from_axis_angle(Gizmo.q0, vec4_x_axis(), -Context.raw.gizmo_drag + Context.raw.gizmo_drag_last);
- quat_mult_quats(Gizmo.q, Gizmo.q0, Gizmo.q);
- quat_from_axis_angle(Gizmo.q0, vec4_y_axis(), -Context.raw.gizmo_drag + Context.raw.gizmo_drag_last);
- if (Context.raw.material != Context.raw.layer.fill_layer) {
- Context.set_material(Context.raw.layer.fill_layer);
- base_update_fill_layer(Context.raw.gizmo_started);
- Context.raw.gizmo_started = false;
- if (mouse_started("left") && paint_object.name != "Scene") {
- // Translate, scale
- let trs: transform_t[] = [
- Context.raw.gizmo_translate_x.transform,
- Context.raw.gizmo_translate_y.transform,
- Context.raw.gizmo_translate_z.transform,
- Context.raw.gizmo_scale_x.transform,
- Context.raw.gizmo_scale_y.transform,
- Context.raw.gizmo_scale_z.transform
- ];
- let hit: transform_t = raycast_closest_box_intersect(trs, mouse_view_x(), mouse_view_y(), scene_camera);
- if (hit != null) {
- if (hit.object == Context.raw.gizmo_translate_x) Context.raw.translate_x = true;
- else if (hit.object == Context.raw.gizmo_translate_y) Context.raw.translate_y = true;
- else if (hit.object == Context.raw.gizmo_translate_z) Context.raw.translate_z = true;
- else if (hit.object == Context.raw.gizmo_scale_x) Context.raw.scale_x = true;
- else if (hit.object == Context.raw.gizmo_scale_y) Context.raw.scale_y = true;
- else if (hit.object == Context.raw.gizmo_scale_z) Context.raw.scale_z = true;
- if (Context.raw.translate_x || Context.raw.translate_y || Context.raw.translate_z || Context.raw.scale_x || Context.raw.scale_y || Context.raw.scale_z) {
- Context.raw.gizmo_offset = 0.0;
- Context.raw.gizmo_started = true;
- // Rotate
- Context.raw.gizmo_rotate_x.transform,
- Context.raw.gizmo_rotate_y.transform,
- Context.raw.gizmo_rotate_z.transform
- if (hit.object == Context.raw.gizmo_rotate_x) Context.raw.rotate_x = true;
- else if (hit.object == Context.raw.gizmo_rotate_y) Context.raw.rotate_y = true;
- else if (hit.object == Context.raw.gizmo_rotate_z) Context.raw.rotate_z = true;
- if (Context.raw.rotate_x || Context.raw.rotate_y || Context.raw.rotate_z) {
- else if (mouse_released("left")) {
- Context.raw.translate_x = Context.raw.translate_y = Context.raw.translate_z = false;
- Context.raw.scale_x = Context.raw.scale_y = Context.raw.scale_z = false;
- Context.raw.rotate_x = Context.raw.rotate_y = Context.raw.rotate_z = false;
- let t: transform_t = paint_object.transform;
- vec4_set(Gizmo.v, transform_world_x(t), transform_world_y(t), transform_world_z(t));
- vec4_set(Gizmo.v, Context.raw.layer.decal_mat.m[12], Context.raw.layer.decal_mat.m[13], Context.raw.layer.decal_mat.m[14]);
- if (Context.raw.translate_x || Context.raw.scale_x) {
- let hit: vec4_t = raycast_plane_intersect(vec4_y_axis(), Gizmo.v, mouse_view_x(), mouse_view_y(), scene_camera);
- if (Context.raw.gizmo_started) Context.raw.gizmo_offset = hit.x - Gizmo.v.x;
- Context.raw.gizmo_drag = hit.x - Context.raw.gizmo_offset;
- else if (Context.raw.translate_y || Context.raw.scale_y) {
- let hit: vec4_t = raycast_plane_intersect(vec4_x_axis(), Gizmo.v, mouse_view_x(), mouse_view_y(), scene_camera);
- if (Context.raw.gizmo_started) Context.raw.gizmo_offset = hit.y - Gizmo.v.y;
- Context.raw.gizmo_drag = hit.y - Context.raw.gizmo_offset;
- else if (Context.raw.translate_z || Context.raw.scale_z) {
- if (Context.raw.gizmo_started) Context.raw.gizmo_offset = hit.z - Gizmo.v.z;
- Context.raw.gizmo_drag = hit.z - Context.raw.gizmo_offset;
- if (Context.raw.gizmo_started) {
- Context.raw.gizmo_offset = Math.atan2(hit.y - Gizmo.v.y, hit.z - Gizmo.v.z);
- Context.raw.gizmo_drag = Math.atan2(hit.y - Gizmo.v.y, hit.z - Gizmo.v.z) - Context.raw.gizmo_offset;
- Context.raw.gizmo_offset = Math.atan2(hit.z - Gizmo.v.z, hit.x - Gizmo.v.x);
- Context.raw.gizmo_drag = Math.atan2(hit.z - Gizmo.v.z, hit.x - Gizmo.v.x) - Context.raw.gizmo_offset;
- let hit: vec4_t = raycast_plane_intersect(vec4_z_axis(), Gizmo.v, mouse_view_x(), mouse_view_y(), scene_camera);
- Context.raw.gizmo_offset = Math.atan2(hit.y - Gizmo.v.y, hit.x - Gizmo.v.x);
- Context.raw.gizmo_drag = Math.atan2(hit.y - Gizmo.v.y, hit.x - Gizmo.v.x) - Context.raw.gizmo_offset;
- if (Context.raw.gizmo_started) Context.raw.gizmo_drag_last = Context.raw.gizmo_drag;
- UtilMesh.remove_merged_mesh();
- RenderPathRaytrace.ready = false;
- _input_occupied = (Context.raw.translate_x || Context.raw.translate_y || Context.raw.translate_z || Context.raw.scale_x || Context.raw.scale_y || Context.raw.scale_z || Context.raw.rotate_x || Context.raw.rotate_y || Context.raw.rotate_z) && mouse_view_x() < base_w();
-///end
@@ -1,743 +0,0 @@
-class History {
- static steps: step_t[];
- static undo_i: i32 = 0; // Undo layer
- static undos: i32 = 0; // Undos available
- static redos: i32 = 0; // Redos available
- static push_undo: bool = false; // Store undo on next paint
- static undo_layers: SlotLayerRaw[] = null;
- ///if is_sculpt
- static push_undo2: bool = false;
- static undo = () => {
- if (History.undos > 0) {
- let active: i32 = History.steps.length - 1 - History.redos;
- let step: step_t = History.steps[active];
- if (step.name == tr("Edit Nodes")) {
- History.swap_canvas(step);
- else if (step.name == tr("New Layer") || step.name == tr("New Black Mask") || step.name == tr("New White Mask") || step.name == tr("New Fill Mask")) {
- Context.raw.layer = Project.layers[step.layer];
- SlotLayer.delete(Context.raw.layer);
- Context.raw.layer = Project.layers[step.layer > 0 ? step.layer - 1 : 0];
- else if (step.name == tr("New Group")) {
- // The layer below is the only layer in the group. Its layer masks are automatically unparented, too.
- Project.layers[step.layer - 1].parent = null;
- else if (step.name == tr("Delete Layer")) {
- let parent: SlotLayerRaw = step.layer_parent > 0 ? Project.layers[step.layer_parent - 1] : null;
- let l: SlotLayerRaw = SlotLayer.create("", step.layer_type, parent);
- Project.layers.splice(step.layer, 0, l);
- History.undo_i = History.undo_i - 1 < 0 ? Config.raw.undo_steps - 1 : History.undo_i - 1;
- let lay: SlotLayerRaw = History.undo_layers[History.undo_i];
- SlotLayer.swap(l, lay);
- l.mask_opacity = step.layer_opacity;
- l.blending = step.layer_blending;
- l.object_mask = step.layer_object;
- // Undo at least second time in order to avoid empty groups
- if (step.layer_type == layer_slot_type_t.GROUP) {
- // 1. Undo deleting group masks
- let n: i32 = 1;
- while (History.steps[active - n].layer_type == layer_slot_type_t.MASK) {
- History.undo();
- ++n;
- // 2. Undo a mask to have a non empty group
- else if (step.name == tr("Clear Layer")) {
- SlotLayer.swap(Context.raw.layer, lay);
- else if (step.name == tr("Duplicate Layer")) {
- let children: SlotLayerRaw[] = SlotLayer.get_recursive_children(Project.layers[step.layer]);
- let position: i32 = step.layer + 1;
- if (children != null)
- position += children.length;
- Context.raw.layer = Project.layers[position];
- else if (step.name == tr("Order Layers")) {
- let target: SlotLayerRaw = Project.layers[step.prev_order];
- Project.layers[step.prev_order] = Project.layers[step.layer];
- Project.layers[step.layer] = target;
- else if (step.name == tr("Merge Layers")) {
- let parent: SlotLayerRaw = step.layer_parent > 0 ? Project.layers[step.layer_parent - 2] : null;
- l = SlotLayer.create("", step.layer_type, parent);
- Project.layers.splice(step.layer + 1, 0, l);
- lay = History.undo_layers[History.undo_i];
- Context.raw.layer.mask_opacity = step.layer_opacity;
- Context.raw.layer.blending = step.layer_blending;
- Context.raw.layer.object_mask = step.layer_object;
- else if (step.name == tr("Apply Mask")) {
- // First restore the layer(s)
- let mask_pos: i32 = step.layer;
- let current_layer: SlotLayerRaw = null;
- // The layer at the old mask position is a mask, i.e. the layer had multiple masks before.
- if (SlotLayer.is_mask(Project.layers[mask_pos])) {
- current_layer = Project.layers[mask_pos].parent;
- else if (SlotLayer.is_layer(Project.layers[mask_pos]) || SlotLayer.is_group(Project.layers[mask_pos])) {
- current_layer = Project.layers[mask_pos];
- let layers_to_restore: SlotLayerRaw[] = SlotLayer.is_group(current_layer) ? SlotLayer.get_children(current_layer) : [current_layer];
- layers_to_restore.reverse();
- for (let layer of layers_to_restore) {
- // Replace the current layer's content with the old one
- Context.raw.layer = layer;
- let old_layer: SlotLayerRaw = History.undo_layers[History.undo_i];
- SlotLayer.swap(Context.raw.layer, old_layer);
- // Now restore the applied mask
- let mask: SlotLayerRaw = History.undo_layers[History.undo_i];
- base_new_mask(false, current_layer, mask_pos);
- SlotLayer.swap(Context.raw.layer, mask);
- Context.set_layer(Context.raw.layer);
- else if (step.name == tr("Invert Mask")) {
- SlotLayer.invert_mask(Context.raw.layer);
- app_notify_on_init(_next);
- else if (step.name == "Apply Filter") {
- Context.set_layer(Project.layers[step.layer]);
- base_new_mask(false, Context.raw.layer);
- else if (step.name == tr("To Fill Layer") || step.name == tr("To Fill Mask")) {
- SlotLayer.to_paint_layer(Context.raw.layer);
- else if (step.name == tr("To Paint Layer") || step.name == tr("To Paint Mask")) {
- Context.raw.layer.fill_layer = Project.materials[step.material];
- else if (step.name == tr("Layer Opacity")) {
- let t: f32 = Context.raw.layer.mask_opacity;
- step.layer_opacity = t;
- else if (step.name == tr("Layer Blending")) {
- let t: blend_type_t = Context.raw.layer.blending;
- step.layer_blending = t;
- else if (step.name == tr("Delete Node Group")) {
- Project.material_groups.splice(step.canvas_group, 0, { canvas: null, nodes: zui_nodes_create() });
- else if (step.name == tr("New Material")) {
- Context.raw.material = Project.materials[step.material];
- step.canvas = Context.raw.material.canvas;
- SlotMaterial.delete(Context.raw.material);
- else if (step.name == tr("Delete Material")) {
- Project.materials.splice(step.material, 0, Context.raw.material);
- Context.raw.material.canvas = step.canvas;
- UINodes.canvas_changed();
- else if (step.name == tr("Duplicate Material")) {
- else { // Paint operation
- Context.select_paint_object(Project.paint_objects[step.object]);
- History.undos--;
- History.redos++;
- if (UIView2D.show) {
- // Refresh undo & redo buttons
- UIMenubar.menu_handle.redraws = 2;
- static redo = () => {
- if (History.redos > 0) {
- let active: i32 = History.steps.length - History.redos;
- if (step.name == tr("New Black Mask")) {
- SlotLayer.clear(l, 0x00000000);
- else if (step.name == tr("New White Mask")) {
- SlotLayer.clear(l, 0xffffffff);
- else if (step.name == tr("New Fill Mask")) {
- SlotLayer.to_fill_layer(l);
- let l: SlotLayerRaw = Project.layers[step.layer - 1];
- let group: SlotLayerRaw = base_new_group();
- Project.layers.splice(step.layer, 0, group);
- l.parent = group;
- History.swap_active();
- // Redoing the last delete would result in an empty group
- // Redo deleting all group masks + the group itself
- if (step.layer_type == layer_slot_type_t.LAYER && History.steps.length >= active + 2 && (History.steps[active + 1].layer_type == layer_slot_type_t.GROUP || History.steps[active + 1].layer_type == layer_slot_type_t.MASK)) {
- while (History.steps[active + n].layer_type == layer_slot_type_t.MASK) {
- for (let i: i32 = 0; i < n; ++i) History.redo();
- SlotLayer.clear(Context.raw.layer);
- base_duplicate_layer(Context.raw.layer);
- Context.raw.layer = Project.layers[step.layer + 1];
- app_notify_on_init(History.redo_merge_layers);
- app_notify_on_init(base_merge_down);
- if (SlotLayer.is_group_mask(Context.raw.layer)) {
- let group: SlotLayerRaw = Context.raw.layer.parent;
- let layers: SlotLayerRaw[] = SlotLayer.get_children(group);
- layers.splice(0, 0, Context.raw.layer);
- History.copy_merging_layers2(layers);
- else History.copy_merging_layers2([Context.raw.layer, Context.raw.layer.parent]);
- SlotLayer.apply_mask(Context.raw.layer);
- else if (step.name == tr("Apply Filter")) {
- base_new_mask(false, lay);
- History.undo_i = (History.undo_i + 1) % Config.raw.undo_steps;
- array_remove(Project.material_groups, Project.material_groups[step.canvas_group]);
- History.undos++;
- History.redos--;
- if (UIView2D.show) UIView2D.hwnd.redraws = 2;
- static reset = () => {
- History.steps = [{name: tr("New"), layer: 0, layer_type: layer_slot_type_t.LAYER, layer_parent: -1, object: 0, material: 0, brush: 0}];
- History.steps = [{name: tr("New")}];
- History.undos = 0;
- History.redos = 0;
- History.undo_i = 0;
- static edit_nodes = (canvas: zui_node_canvas_t, canvas_type: i32, canvas_group: Null<i32> = null) => {
- static edit_nodes = (canvas: zui_node_canvas_t, canvas_group: Null<i32> = null) => {
- let step: step_t = History.push(tr("Edit Nodes"));
- step.canvas_group = canvas_group;
- step.canvas_type = canvas_type;
- step.canvas = JSON.parse(JSON.stringify(canvas));
- static paint = () => {
- History.copy_to_undo(Context.raw.layer.id, History.undo_i, is_mask);
- History.push_undo = false;
- History.push(tr(UIToolbar.tool_names[Context.raw.tool]));
- static new_layer = () => {
- History.push(tr("New Layer"));
- static new_black_mask = () => {
- History.push(tr("New Black Mask"));
- static new_white_mask = () => {
- History.push(tr("New White Mask"));
- static new_fill_mask = () => {
- History.push(tr("New Fill Mask"));
- static new_group = () => {
- History.push(tr("New Group"));
- static duplicate_layer = () => {
- History.push(tr("Duplicate Layer"));
- static delete_layer = () => {
- History.push(tr("Delete Layer"));
- static clear_layer = () => {
- History.push(tr("Clear Layer"));
- static order_layers = (prevOrder: i32) => {
- let step: step_t = History.push(tr("Order Layers"));
- step.prev_order = prevOrder;
- static merge_layers = () => {
- History.copy_merging_layers();
- let step: step_t = History.push(tr("Merge Layers"));
- step.layer -= 1; // Merge down
- if (SlotLayer.has_masks(Context.raw.layer)) {
- step.layer -= SlotLayer.get_masks(Context.raw.layer).length;
- History.steps.shift(); // Merge consumes 2 steps
- // TODO: use undo layer in app_merge_down to save memory
- static apply_mask = () => {
- History.push(tr("Apply Mask"));
- static invert_mask = () => {
- History.push(tr("Invert Mask"));
- static apply_filter = () => {
- History.copy_to_undo(Context.raw.layer.id, History.undo_i, true);
- History.push(tr("Apply Filter"));
- static to_fill_layer = () => {
- History.copy_to_undo(Context.raw.layer.id, History.undo_i, false);
- History.push(tr("To Fill Layer"));
- static to_fill_mask = () => {
- History.push(tr("To Fill Mask"));
- static to_paint_layer = () => {
- History.push(tr("To Paint Layer"));
- static to_paint_mask = () => {
- History.push(tr("To Paint Mask"));
- static layer_opacity = () => {
- History.push(tr("Layer Opacity"));
- // static layer_object = () => {
- // History.push("Layer Object");
- static layer_blending = () => {
- History.push(tr("Layer Blending"));
- static new_material = () => {
- let step: step_t = History.push(tr("New Material"));
- step.canvas_type = 0;
- step.canvas = JSON.parse(JSON.stringify(Context.raw.material.canvas));
- static delete_material = () => {
- let step: step_t = History.push(tr("Delete Material"));
- static duplicate_material = () => {
- let step: step_t = History.push(tr("Duplicate Material"));
- static delete_material_group = (group: node_group_t) => {
- let step: step_t = History.push(tr("Delete Node Group"));
- step.canvas_type = canvas_type_t.MATERIAL;
- step.canvas_group = Project.material_groups.indexOf(group);
- step.canvas = JSON.parse(JSON.stringify(group.canvas));
- static push = (name: string): step_t => {
- ///if (krom_windows || krom_linux || krom_darwin)
- let filename: string = Project.filepath == "" ? UIFiles.filename : Project.filepath.substring(Project.filepath.lastIndexOf(Path.sep) + 1, Project.filepath.length - 4);
- sys_title_set(filename + "* - " + manifest_title);
- if (History.undos < Config.raw.undo_steps) History.undos++;
- for (let i: i32 = 0; i < History.redos; ++i) History.steps.pop();
- let opos: i32 = Project.paint_objects.indexOf(Context.raw.paint_object);
- let lpos: i32 = Project.layers.indexOf(Context.raw.layer);
- let mpos: i32 = Project.materials.indexOf(Context.raw.material);
- let bpos: i32 = Project.brushes.indexOf(Context.raw.brush);
- History.steps.push({
- name: name,
- layer: lpos,
- layer_type: SlotLayer.is_mask(Context.raw.layer) ? layer_slot_type_t.MASK : SlotLayer.is_group(Context.raw.layer) ? layer_slot_type_t.GROUP : layer_slot_type_t.LAYER,
- layer_parent: Context.raw.layer.parent == null ? -1 : Project.layers.indexOf(Context.raw.layer.parent),
- object: opos,
- material: mpos,
- brush: bpos,
- layer_opacity: Context.raw.layer.mask_opacity,
- layer_object: Context.raw.layer.object_mask,
- layer_blending: Context.raw.layer.blending
- name: name
- while (History.steps.length > Config.raw.undo_steps + 1) History.steps.shift();
- return History.steps[History.steps.length - 1];
- static redo_merge_layers = () => {
- static copy_merging_layers = () => {
- let lay: SlotLayerRaw = Context.raw.layer;
- History.copy_to_undo(lay.id, History.undo_i, SlotLayer.is_mask(Context.raw.layer));
- let below: i32 = Project.layers.indexOf(lay) - 1;
- lay = Project.layers[below];
- static copy_merging_layers2 = (layers: SlotLayerRaw[]) => {
- for (let layer of layers)
- History.copy_to_undo(layer.id, History.undo_i, SlotLayer.is_mask(layer));
- static swap_active = () => {
- let undo_layer: SlotLayerRaw = History.undo_layers[History.undo_i];
- SlotLayer.swap(undo_layer, Context.raw.layer);
- static copy_to_undo = (fromId: i32, toId: i32, isMask: bool) => {
- isMask = true;
- if (isMask) {
- render_path_set_target("texpaint_undo" + toId);
- render_path_bind_target("texpaint" + fromId, "tex");
- // render_path_draw_shader("shader_datas/copy_pass/copyR8_pass");
- render_path_draw_shader("shader_datas/copy_pass/copy_pass");
- render_path_set_target("texpaint_undo" + toId, ["texpaint_nor_undo" + toId, "texpaint_pack_undo" + toId]);
- render_path_bind_target("texpaint" + fromId, "tex0");
- render_path_bind_target("texpaint_nor" + fromId, "tex1");
- render_path_bind_target("texpaint_pack" + fromId, "tex2");
- render_path_draw_shader("shader_datas/copy_mrt3_pass/copy_mrt3_pass");
- static get_canvas_owner = (step: step_t): any => {
- return step.canvas_group == null ?
- Project.materials[step.material] :
- Project.material_groups[step.canvas_group];
- return null;
- static swap_canvas = (step: step_t) => {
- if (step.canvas_type == 0) {
- let _canvas: zui_node_canvas_t = History.get_canvas_owner(step).canvas;
- History.get_canvas_owner(step).canvas = step.canvas;
- step.canvas = _canvas;
- let _canvas: zui_node_canvas_t = Project.brushes[step.brush].canvas;
- Project.brushes[step.brush].canvas = step.canvas;
- Context.raw.brush = Project.brushes[step.brush];
-type step_t = {
- canvas?: zui_node_canvas_t; // Node history
- canvas_group?: i32;
- layer?: i32;
- layer_type?: layer_slot_type_t;
- layer_parent?: i32;
- object?: i32;
- material?: i32;
- brush?: i32;
- layer_opacity?: f32;
- layer_object?: i32;
- layer_blending?: i32;
- prev_order?: i32; // Previous layer position
- canvas_type?: i32;
@@ -23,17 +23,17 @@ class ImportArm {
let import_as_mesh: bool = project.version == null;
- Context.raw.layer_filter = 0;
+ context_raw.layer_filter = 0;
let import_as_mesh: bool = true;
- Project.project_new(import_as_mesh);
- Project.filepath = path;
- UIFiles.filename = path.substring(path.lastIndexOf(Path.sep) + 1, path.lastIndexOf("."));
+ project_new(import_as_mesh);
+ project_filepath = path;
+ UIFiles.filename = path.substring(path.lastIndexOf(path_sep) + 1, path.lastIndexOf("."));
sys_title_set(UIFiles.filename);
@@ -54,38 +54,38 @@ class ImportArm {
let recent_path: string = path;
- Project.raw = project;
+ project_raw = project;
let l0: layer_data_t = project.layer_datas[0];
- base_res_handle.position = Config.get_texture_res_pos(l0.res);
+ base_res_handle.position = config_get_texture_res_pos(l0.res);
let bits_pos: texture_bits_t = l0.bpp == 8 ? texture_bits_t.BITS8 : l0.bpp == 16 ? texture_bits_t.BITS16 : texture_bits_t.BITS32;
base_bits_handle.position = bits_pos;
let bytes_per_pixel: i32 = Math.floor(l0.bpp / 8);
let format: tex_format_t = l0.bpp == 8 ? tex_format_t.RGBA32 : l0.bpp == 16 ? tex_format_t.RGBA64 : tex_format_t.RGBA128;
- let base: string = Path.base_dir(path);
- if (Project.raw.envmap != null) {
- Project.raw.envmap = data_is_abs(Project.raw.envmap) ? Project.raw.envmap : base + Project.raw.envmap;
+ let base: string = path_base_dir(path);
+ if (project_raw.envmap != null) {
+ project_raw.envmap = data_is_abs(project_raw.envmap) ? project_raw.envmap : base + project_raw.envmap;
- if (Project.raw.envmap_strength != null) {
- scene_world.strength = Project.raw.envmap_strength;
+ if (project_raw.envmap_strength != null) {
+ scene_world.strength = project_raw.envmap_strength;
- if (Project.raw.camera_world != null) {
- scene_camera.base.transform.local = mat4_from_f32_array(Project.raw.camera_world);
+ if (project_raw.camera_world != null) {
+ scene_camera.base.transform.local = mat4_from_f32_array(project_raw.camera_world);
transform_decompose(scene_camera.base.transform);
- scene_camera.data.fov = Project.raw.camera_fov;
+ scene_camera.data.fov = project_raw.camera_fov;
- let origin: Float32Array = Project.raw.camera_origin;
- Camera.origins[0].x = origin[0];
- Camera.origins[0].y = origin[1];
- Camera.origins[0].z = origin[2];
+ let origin: Float32Array = project_raw.camera_origin;
+ camera_origins[0].x = origin[0];
+ camera_origins[0].y = origin[1];
+ camera_origins[0].z = origin[2];
for (let file of project.assets) {
@@ -97,13 +97,13 @@ class ImportArm {
// Convert image path from relative to absolute
let abs: string = data_is_abs(file) ? file : base + file;
if (project.packed_assets != null) {
- abs = Path.normalize(abs);
+ abs = path_normalize(abs);
ImportArm.unpack_asset(project, abs, file);
- if (data_cached_images.get(abs) == null && !File.exists(abs)) {
+ if (data_cached_images.get(abs) == null && !file_exists(abs)) {
ImportArm.make_pink(abs);
- let hdr_as_envmap: bool = abs.endsWith(".hdr") && Project.raw.envmap == abs;
+ let hdr_as_envmap: bool = abs.endsWith(".hdr") && project_raw.envmap == abs;
ImportTexture.run(abs, hdr_as_envmap);
@@ -117,7 +117,7 @@ class ImportArm {
// Convert font path from relative to absolute
- if (File.exists(abs)) {
+ if (file_exists(abs)) {
ImportFont.run(abs);
@@ -132,66 +132,66 @@ class ImportArm {
let md: mesh_data_t = mesh_data_create(project.mesh_data);
- mesh_object_set_data(Context.raw.paint_object, md);
- vec4_set(Context.raw.paint_object.base.transform.scale, 1, 1, 1);
- transform_build_matrix(Context.raw.paint_object.base.transform);
- Context.raw.paint_object.base.name = md.name;
- Project.paint_objects = [Context.raw.paint_object];
+ mesh_object_set_data(context_raw.paint_object, md);
+ vec4_set(context_raw.paint_object.base.transform.scale, 1, 1, 1);
+ transform_build_matrix(context_raw.paint_object.base.transform);
+ context_raw.paint_object.base.name = md.name;
+ project_paint_objects = [context_raw.paint_object];
for (let i: i32 = 1; i < project.mesh_datas.length; ++i) {
let raw: mesh_data_t = project.mesh_datas[i];
- let object: mesh_object_t = scene_add_mesh_object(md, Context.raw.paint_object.materials, Context.raw.paint_object.base);
+ let object: mesh_object_t = scene_add_mesh_object(md, context_raw.paint_object.materials, context_raw.paint_object.base);
object.base.name = md.name;
- Project.paint_objects.push(object);
+ project_paint_objects.push(object);
if (project.mesh_assets != null && project.mesh_assets.length > 0) {
let file: string = project.mesh_assets[0];
- Project.mesh_assets = [abs];
+ project_mesh_assets = [abs];
- if (project.atlas_objects != null) Project.atlas_objects = project.atlas_objects;
- if (project.atlas_names != null) Project.atlas_names = project.atlas_names;
+ if (project.atlas_objects != null) project_atlas_objects = project.atlas_objects;
+ if (project.atlas_names != null) project_atlas_names = project.atlas_names;
- if (Context.raw.merged_object == null) UtilMesh.merge_mesh();
+ if (context_raw.merged_object == null) UtilMesh.merge_mesh();
- Context.select_paint_object(Context.main_object());
- Context.raw.paint_object.skip_context = "paint";
- Context.raw.merged_object.base.visible = true;
+ context_select_paint_object(context_main_object());
+ context_raw.paint_object.skip_context = "paint";
+ context_raw.merged_object.base.visible = true;
- let tex: image_t = Project.layers[0].texpaint;
- if (tex.width != Config.get_texture_res_x() || tex.height != Config.get_texture_res_y()) {
- if (History.undo_layers != null) for (let l of History.undo_layers) SlotLayer.resize_and_set_bits(l);
+ let tex: image_t = project_layers[0].texpaint;
+ if (tex.width != config_get_texture_res_x() || tex.height != config_get_texture_res_y()) {
+ if (history_undo_layers != null) for (let l of history_undo_layers) SlotLayer.resize_and_set_bits(l);
let _texpaint_blend0: image_t = rts.get("texpaint_blend0")._image;
image_unload(_texpaint_blend0);
- rts.get("texpaint_blend0").width = Config.get_texture_res_x();
- rts.get("texpaint_blend0").height = Config.get_texture_res_y();
- rts.get("texpaint_blend0")._image = image_create_render_target(Config.get_texture_res_x(), Config.get_texture_res_y(), tex_format_t.R8, depth_format_t.NO_DEPTH);
+ rts.get("texpaint_blend0").width = config_get_texture_res_x();
+ rts.get("texpaint_blend0").height = config_get_texture_res_y();
+ rts.get("texpaint_blend0")._image = image_create_render_target(config_get_texture_res_x(), config_get_texture_res_y(), tex_format_t.R8, depth_format_t.NO_DEPTH);
let _texpaint_blend1: image_t = rts.get("texpaint_blend1")._image;
image_unload(_texpaint_blend1);
- rts.get("texpaint_blend1").width = Config.get_texture_res_x();
- rts.get("texpaint_blend1").height = Config.get_texture_res_y();
- rts.get("texpaint_blend1")._image = image_create_render_target(Config.get_texture_res_x(), Config.get_texture_res_y(), tex_format_t.R8, depth_format_t.NO_DEPTH);
+ rts.get("texpaint_blend1").width = config_get_texture_res_x();
+ rts.get("texpaint_blend1").height = config_get_texture_res_y();
+ rts.get("texpaint_blend1")._image = image_create_render_target(config_get_texture_res_x(), config_get_texture_res_y(), tex_format_t.R8, depth_format_t.NO_DEPTH);
- for (let l of Project.layers) SlotLayer.unload(l);
- Project.layers = [];
+ for (let l of project_layers) SlotLayer.unload(l);
+ project_layers = [];
for (let i: i32 = 0; i < project.layer_datas.length; ++i) {
let ld: layer_data_t = project.layer_datas[i];
let is_group: bool = ld.texpaint == null;
@@ -206,7 +206,7 @@ class ImportArm {
let l: SlotLayerRaw = SlotLayer.create("", is_group ? layer_slot_type_t.GROUP : is_mask ? layer_slot_type_t.MASK : layer_slot_type_t.LAYER);
if (ld.name != null) l.name = ld.name;
l.visible = ld.visible;
- Project.layers.push(l);
+ project_layers.push(l);
if (!is_group) {
@@ -289,42 +289,42 @@ class ImportArm {
if (ld.parent >= 0) {
- Project.layers[i].parent = Project.layers[ld.parent];
+ project_layers[i].parent = project_layers[ld.parent];
- Context.set_layer(Project.layers[0]);
+ context_set_layer(project_layers[0]);
// Materials
let m0: material_data_t = data_get_material("Scene", "Material");
- Project.materials = [];
+ project_materials = [];
for (let n of project.material_nodes) {
ImportArm.init_nodes(n.nodes);
- Context.raw.material = SlotMaterial.create(m0, n);
+ context_raw.material = SlotMaterial.create(m0, n);
UINodes.hwnd.redraws = 2;
UINodes.group_stack = [];
- Project.material_groups = [];
+ project_material_groups = [];
if (project.material_groups != null) {
- for (let g of project.material_groups) Project.material_groups.push({ canvas: g, nodes: zui_nodes_create() });
+ for (let g of project.material_groups) project_material_groups.push({ canvas: g, nodes: zui_nodes_create() });
+ context_raw.material = m;
- Project.brushes = [];
+ project_brushes = [];
for (let n of project.brush_nodes) {
- Context.raw.brush = SlotBrush.create(n);
- Project.brushes.push(Context.raw.brush);
+ context_raw.brush = SlotBrush.create(n);
+ project_brushes.push(context_raw.brush);
MakeMaterial.parse_brush();
UtilRender.make_brush_preview();
@@ -332,10 +332,10 @@ class ImportArm {
// Fill layers
- l.fill_layer = ld.fill_layer > -1 ? Project.materials[ld.fill_layer] : null;
+ l.fill_layer = ld.fill_layer > -1 ? project_materials[ld.fill_layer] : null;
@@ -345,26 +345,26 @@ class ImportArm {
ImportArm.init_nodes(project.material.nodes);
- Project.canvas = project.material;
+ project_canvas = project.material;
data_delete_blob(path);
static run_mesh = (raw: scene_t) => {
- Project.paint_objects = [];
+ project_paint_objects = [];
for (let i: i32 = 0; i < raw.mesh_datas.length; ++i) {
let md: mesh_data_t = mesh_data_create(raw.mesh_datas[i]);
let object: mesh_object_t = null;
if (i == 0) {
- object = Context.raw.paint_object;
+ object = context_raw.paint_object;
- object = scene_add_mesh_object(md, Context.raw.paint_object.materials, Context.raw.paint_object.base);
+ object = scene_add_mesh_object(md, context_raw.paint_object.materials, context_raw.paint_object.base);
md._.handle = md.name;
@@ -373,12 +373,12 @@ class ImportArm {
vec4_set(object.base.transform.scale, 1, 1, 1);
transform_build_matrix(object.base.transform);
app_notify_on_init(base_init_layers);
static run_material = (path: string) => {
@@ -389,7 +389,7 @@ class ImportArm {
static run_material_from_project = (project: project_format_t, path: string) => {
file = string_replace_all(file, "/", "\\");
@@ -399,10 +399,10 @@ class ImportArm {
ImportTexture.run(abs);
@@ -414,23 +414,23 @@ class ImportArm {
for (let c of project.material_nodes) {
ImportArm.init_nodes(c.nodes);
- Context.raw.material = SlotMaterial.create(m0, c);
- imported.push(Context.raw.material);
+ context_raw.material = SlotMaterial.create(m0, c);
+ imported.push(context_raw.material);
for (let c of project.material_groups) {
while (ImportArm.group_exists(c)) ImportArm.rename_group(c.name, imported, project.material_groups); // Ensure unique group name
- Project.material_groups.push({ canvas: c, nodes: zui_nodes_create() });
+ project_material_groups.push({ canvas: c, nodes: zui_nodes_create() });
for (let m of imported) {
@@ -443,7 +443,7 @@ class ImportArm {
static group_exists = (c: zui_node_canvas_t): bool => {
if (g.canvas.name == c.name) return true;
@@ -471,7 +471,7 @@ class ImportArm {
static run_brush_from_project = (project: project_format_t, path: string) => {
@@ -481,10 +481,10 @@ class ImportArm {
@@ -494,14 +494,14 @@ class ImportArm {
- imported.push(Context.raw.brush);
+ imported.push(context_raw.brush);
for (let b of imported) {
- Context.set_brush(b);
+ context_set_brush(b);
@@ -521,16 +521,16 @@ class ImportArm {
static run_swatches_from_project = (project: project_format_t, path: string, replaceExisting: bool = false) => {
if (replaceExisting) {
- Project.raw.swatches = [];
+ project_raw.swatches = [];
if (project.swatches == null) { // No swatches contained
- Project.raw.swatches.push(Project.make_swatch());
+ project_raw.swatches.push(make_swatch());
if (project.swatches != null) {
for (let s of project.swatches) {
- Project.raw.swatches.push(s);
+ project_raw.swatches.push(s);
UIBase.hwnds[tab_area_t.STATUS].redraws = 2;
@@ -538,7 +538,7 @@ class ImportArm {
static make_pink = (abs: string) => {
- Console.error(Strings.error2() + " " + abs);
+ console_error(strings_error2() + " " + abs);
let b: Uint8Array = new Uint8Array(4);
b[0] = 255;
b[1] = 0;
@@ -566,8 +566,8 @@ class ImportArm {
static unpack_asset = (project: project_format_t, abs: string, file: string) => {
- if (Project.raw.packed_assets == null) {
- Project.raw.packed_assets = [];
+ if (project_raw.packed_assets == null) {
+ project_raw.packed_assets = [];
for (let pa of project.packed_assets) {
@@ -575,11 +575,11 @@ class ImportArm {
pa.name = string_replace_all(pa.name, "\\", "/");
- pa.name = Path.normalize(pa.name);
+ pa.name = path_normalize(pa.name);
if (pa.name == file) pa.name = abs; // From relative to absolute
if (pa.name == abs) {
- if (!Project.packed_asset_exists(Project.raw.packed_assets, pa.name)) {
- Project.raw.packed_assets.push(pa);
+ if (!project_packed_asset_exists(project_raw.packed_assets, pa.name)) {
+ project_raw.packed_assets.push(pa);
let image: image_t = image_from_encoded_bytes(pa.bytes, pa.name.endsWith(".jpg") ? ".jpg" : ".png");
data_cached_images.set(abs, image);
@@ -5,7 +5,7 @@ class ImportAsset {
if (path.startsWith("cloud")) {
let do_cache_cloud = () => {
- File.cache_cloud(path, (abs: string) => {
+ file_cache_cloud(path, (abs: string) => {
if (abs == null) return;
ImportAsset.run(abs, dropX, dropY, showBox, hdrAsEnvmap, done);
@@ -13,7 +13,7 @@ class ImportAsset {
- Console.toast(tr("Downloading"));
+ console_toast(tr("Downloading"));
base_notify_on_next_frame(do_cache_cloud);
@@ -23,19 +23,19 @@ class ImportAsset {
- if (Path.is_mesh(path)) {
- showBox ? Project.import_mesh_box(path) : ImportMesh.run(path);
+ if (path_is_mesh(path)) {
+ showBox ? project_import_mesh_box(path) : ImportMesh.run(path);
if (dropX > 0) UIBox.click_to_hide = false; // Prevent closing when going back to window after drag and drop
- else if (Path.is_texture(path)) {
+ else if (path_is_texture(path)) {
ImportTexture.run(path, hdrAsEnvmap);
// Place image node
let x0: i32 = UINodes.wx;
let x1: i32 = UINodes.wx + UINodes.ww;
if (UINodes.show && dropX > x0 && dropX < x1) {
let asset_index: i32 = 0;
- for (let i: i32 = 0; i < Project.assets.length; ++i) {
- if (Project.assets[i].file == path) {
+ for (let i: i32 = 0; i < project_assets.length; ++i) {
+ if (project_assets[i].file == path) {
asset_index = i;
@@ -46,35 +46,35 @@ class ImportAsset {
- if (Context.raw.tool == workspace_tool_t.COLORID && Project.asset_names.length == 1) {
+ if (context_raw.tool == workspace_tool_t.COLORID && project_asset_names.length == 1) {
- else if (Path.is_project(path)) {
+ else if (path_is_project(path)) {
ImportArm.run_project(path);
- else if (Path.is_plugin(path)) {
+ else if (path_is_plugin(path)) {
ImportPlugin.run(path);
- else if (Path.is_gimp_color_palette(path)) {
+ else if (path_is_gimp_color_palette(path)) {
ImportGpl.run(path, false);
- else if (Path.is_font(path)) {
+ else if (path_is_font(path)) {
ImportFont.run(path);
- else if (Path.is_folder(path)) {
+ else if (path_is_folder(path)) {
ImportFolder.run(path);
- if (Context.enable_import_plugin(path)) {
+ if (context_enable_import_plugin(path)) {
ImportAsset.run(path, dropX, dropY, showBox);
+ console_error(strings_error1());
@@ -7,13 +7,13 @@ class ImportBlendMaterial {
let b: ArrayBuffer = data_get_blob(path);
let bl: BlendRaw = ParserBlend.init(b);
if (bl.dna == null) {
+ console_error(strings_error3());
let mats: BlHandleRaw[] = ParserBlend.get(bl, "Material");
if (mats.length == 0) {
- Console.error("Error: No materials found");
+ console_error("Error: No materials found");
@@ -21,11 +21,11 @@ class ImportBlendMaterial {
for (let mat of mats) {
// Material slot
canvas.name = BlHandle.get(BlHandle.get(mat, "id"), "name").substr(2); // MAWood
@@ -55,7 +55,7 @@ class ImportBlendMaterial {
node = BlHandle.get(node, "next");
if (BlHandle.get(node, "idname") != "ShaderNodeBsdfPrincipled") {
- Console.error("Error: No Principled BSDF node found");
+ console_error("Error: No Principled BSDF node found");
continue;
@@ -107,9 +107,9 @@ class ImportBlendMaterial {
if (search == "teximage") {
let img: any = BlHandle.get(node, "id", 0, "Image");
let file: string = BlHandle.get(img, "name").substr(2); // '//desktop\logo.png'
- file = Path.base_dir(path) + file;
+ file = path_base_dir(path) + file;
ImportTexture.run(file);
let filename: string = ar[ar.length - 1];
n.buttons[0].default_value = base_get_asset_index(filename);
@@ -240,12 +240,12 @@ class ImportBlendMaterial {
link = BlHandle.get(link, "next");
if (last.block == link.block) break;
@@ -7,7 +7,7 @@ class ImportBlendMesh {
@@ -76,7 +76,7 @@ class ImportBlendMesh {
let hasuv: bool = uvdata != null;
let texa: Int16Array = hasuv ? new Int16Array(numtri * 3 * 2) : null;
- let hascol: bool = Context.raw.parse_vcols && coldata != null;
+ let hascol: bool = context_raw.parse_vcols && coldata != null;
let cola: Int16Array = hascol ? new Int16Array(numtri * 3 * 4) : null;
let tri: i32 = 0;
@@ -437,8 +437,8 @@ class ImportBlendMesh {
cola: cola,
inda: inda,
name: name,
- scalePos: scale_pos,
- scaleTes: 1.0
+ scale_pos: scale_pos,
+ scale_tex: 1.0
(first && replaceExisting) ? ImportMesh.make_mesh(obj, path) : ImportMesh.add_mesh(obj);
@@ -83,12 +83,12 @@ class ImportEnvmap {
scene_world.envmap = path;
scene_world._.radiance = ImportEnvmap.radiance_cpu;
scene_world._.radiance_mipmaps = ImportEnvmap.mips_cpu;
- Context.raw.saved_envmap = image;
- if (Context.raw.show_envmap_blur) {
+ context_raw.saved_envmap = image;
+ if (context_raw.show_envmap_blur) {
scene_world._.envmap = scene_world._.radiance_mipmaps[0];
- Project.raw.envmap = path;
+ project_raw.envmap = path;
static get_radiance_mip = (mip: image_t, level: i32, radiance: image_t) => {
@@ -4,9 +4,9 @@
class ImportFont {
- for (let f of Project.fonts) {
+ for (let f of project_fonts) {
if (f.file == path) {
- Console.info(Strings.info0());
+ console_info(strings_info0());
@@ -15,7 +15,7 @@ class ImportFont {
let count: i32 = krom_g2_font_count(font.font_);
let font_slots: SlotFontRaw[] = [];
for (let i: i32 = 0; i < count; ++i) {
- let ar: string[] = path.split(Path.sep);
+ let ar: string[] = path.split(path_sep);
let f: g2_font_t = g2_font_clone(font);
g2_font_set_font_index(f, i);
@@ -25,8 +25,8 @@ class ImportFont {
for (let f of font_slots) {
- Project.fonts.push(f);
+ context_raw.font = f;
+ project_fonts.push(f);
UtilRender.make_font_preview();
@@ -11,7 +11,7 @@ class ImportGpl {
// let view: DataView = new DataView(b);
// // GIMP's color palette importer: https://gitlab.gnome.org/GNOME/gimp/-/blob/gimp-2-10/app/core/gimppalette-load.c#L39
// if (!lines[0].startsWith("GIMP Palette")) {
- // Console.error(tr("Not a valid GIMP color palette"));
+ // console_error(tr("Not a valid GIMP color palette"));
// return;
@@ -23,22 +23,22 @@ class ImportGpl {
// else {
// let tokens: string[] = delimiter.split(line);
// if (tokens.length < 3) continue;
- // let swatch: TSwatchColor = Project.makeSwatch(Color.fromBytes(String(tokens[0]), String(tokens[1]), String(tokens[2])));
+ // let swatch: TSwatchColor = makeSwatch(Color.fromBytes(String(tokens[0]), String(tokens[1]), String(tokens[2])));
// swatches.push(swatch);
// if (replaceExisting) {
- // Project.raw.swatches = [];
+ // raw.swatches = [];
// if (swatches.length == 0) { // No swatches contained
- // Project.raw.swatches.push(Project.makeSwatch());
+ // raw.swatches.push(makeSwatch());
// if (swatches.length > 0) {
// for (let s of swatches) {
- // Project.raw.swatches.push(s);
+ // raw.swatches.push(s);
@@ -2,16 +2,16 @@
class ImportKeymap {
- if (!Path.is_json(path)) {
+ if (!path_is_json(path)) {
- let dst_path: string = Path.data() + Path.sep + "keymap_presets" + Path.sep + filename;
- File.copy(path, dst_path); // Copy to preset folder
+ let dst_path: string = path_data() + path_sep + "keymap_presets" + path_sep + filename;
+ file_copy(path, dst_path); // Copy to preset folder
- Console.info(tr("Keymap imported:") + " " + filename);
+ console_info(tr("Keymap imported:") + " " + filename);
@@ -15,16 +15,16 @@ class ImportMesh {
static run = (path: string, replace_existing: bool = true) => {
- if (!Path.is_mesh(path)) {
- if (!Context.enable_import_plugin(path)) {
+ if (!path_is_mesh(path)) {
+ if (!context_enable_import_plugin(path)) {
ImportMesh.clear_layers = _clear_layers;
ImportMesh.meshes_to_unwrap = null;
@@ -34,7 +34,7 @@ class ImportMesh {
else if (p.endsWith(".blend")) ImportBlendMesh.run(path, replace_existing);
let ext: string = path.substr(path.lastIndexOf(".") + 1);
- let importer: (s: string, f: (a: any)=>void)=>void = Path.mesh_importers.get(ext);
+ let importer: (s: string, f: (a: any)=>void)=>void = path_mesh_importers.get(ext);
replace_existing ? ImportMesh.make_mesh(mesh, path) : ImportMesh.add_mesh(mesh);
@@ -45,47 +45,47 @@ class ImportMesh {
ImportMesh.add_mesh(mesh);
// let m: mat4_t = fromFloat32Array(mesh.transform);
- // Project.paintObjects[Project.paintObjects.length - 1].transform.localOnly = true;
- // Project.paintObjects[Project.paintObjects.length - 1].transform.setMatrix(m);
+ // paintObjects[paintObjects.length - 1].transform.localOnly = true;
+ // paintObjects[paintObjects.length - 1].transform.setMatrix(m);
- Project.mesh_assets = [path];
+ project_mesh_assets = [path];
static finish_import = () => {
- mesh_data_delete(Context.raw.merged_object.data);
- mesh_object_remove(Context.raw.merged_object);
- Context.raw.merged_object = null;
+ mesh_data_delete(context_raw.merged_object.data);
+ mesh_object_remove(context_raw.merged_object);
+ context_raw.merged_object = null;
- if (Project.paint_objects.length > 1) {
+ if (project_paint_objects.length > 1) {
- Project.paint_objects.sort((a, b): i32 => {
+ project_paint_objects.sort((a, b): i32 => {
- for (let p of Project.paint_objects) p.base.visible = true;
+ for (let p of project_paint_objects) p.base.visible = true;
- if (Context.raw.paint_object.base.name == "") Context.raw.paint_object.base.name = "Object";
+ if (context_raw.paint_object.base.name == "") context_raw.paint_object.base.name = "Object";
@@ -98,7 +98,7 @@ class ImportMesh {
- Context.raw.paint_body = null;
+ context_raw.paint_body = null;
@@ -107,28 +107,28 @@ class ImportMesh {
- Context.raw.paint_object = Context.main_object();
+ context_raw.paint_object = context_main_object();
- let p: mesh_object_t = Project.paint_objects[i];
- if (p == Context.raw.paint_object) continue;
+ let p: mesh_object_t = project_paint_objects[i];
+ if (p == context_raw.paint_object) continue;
- let handle: string = Context.raw.paint_object.data._.handle;
+ let handle: string = context_raw.paint_object.data._.handle;
- Context.raw.paint_object.base.name = mesh.name;
+ context_raw.paint_object.base.name = mesh.name;
@@ -140,13 +140,13 @@ class ImportMesh {
if (ImportMesh.clear_layers) {
- let l: SlotLayerRaw = Project.layers.pop();
+ let l: SlotLayerRaw = project_layers.pop();
base_new_layer(false);
@@ -161,7 +161,7 @@ class ImportMesh {
static make_mesh = (mesh: any, path: string) => {
@@ -171,9 +171,9 @@ class ImportMesh {
let first_unwrap_done = (mesh: any) => {
ImportMesh._make_mesh(mesh);
- for (let mesh of ImportMesh.meshes_to_unwrap) Project.unwrap_mesh_box(mesh, ImportMesh._add_mesh, true);
+ for (let mesh of ImportMesh.meshes_to_unwrap) project_unwrap_mesh_box(mesh, ImportMesh._add_mesh, true);
- Project.unwrap_mesh_box(mesh, first_unwrap_done);
+ project_unwrap_mesh_box(mesh, first_unwrap_done);
@@ -186,12 +186,12 @@ class ImportMesh {
object.base.name = mesh.name;
@@ -199,12 +199,12 @@ class ImportMesh {
@@ -217,7 +217,7 @@ class ImportMesh {
static add_mesh = (mesh: any) => {
if (mesh.texa == null) {
if (ImportMesh.meshes_to_unwrap != null) ImportMesh.meshes_to_unwrap.push(mesh);
- else Project.unwrap_mesh_box(mesh, ImportMesh._add_mesh);
+ else project_unwrap_mesh_box(mesh, ImportMesh._add_mesh);
ImportMesh._add_mesh(mesh);
@@ -235,8 +235,8 @@ class ImportMesh {
index_arrays: [
{ values: mesh.inda, material: 0 }
],
- scale_pos: mesh.scalePos,
- scale_tex: mesh.scaleTex
+ scale_pos: mesh.scale_pos,
+ scale_tex: mesh.scale_tex
class ImportObj {
- let i: split_type_t = Context.raw.split_by;
+ let i: split_type_t = context_raw.split_by;
let is_udim: bool = i == split_type_t.UDIM;
let split_code: i32 =
(i == split_type_t.OBJECT || is_udim) ? "o".charCodeAt(0) :
@@ -35,7 +35,7 @@ class ImportObj {
parts.push(part);
- if (Context.raw.split_by == split_type_t.MATERIAL) {
+ if (context_raw.split_by == split_type_t.MATERIAL) {
let posa0: Int16Array;
let posa1: Int16Array;
let nora0: Int16Array;
@@ -61,21 +61,21 @@ class ImportObj {
// Repack merged positions
let posa32: Float32Array = new Float32Array(Math.floor(posa0.length / 4) * 3 + Math.floor(posa1.length / 4) * 3);
for (let k: i32 = 0; k < Math.floor(posa0.length / 4); ++k) {
- posa32[k * 3 ] = posa0[k * 4 ] / 32767 * parts[i].scalePos;
- posa32[k * 3 + 1] = posa0[k * 4 + 1] / 32767 * parts[i].scalePos;
- posa32[k * 3 + 2] = posa0[k * 4 + 2] / 32767 * parts[i].scalePos;
+ posa32[k * 3 ] = posa0[k * 4 ] / 32767 * parts[i].scale_pos;
+ posa32[k * 3 + 1] = posa0[k * 4 + 1] / 32767 * parts[i].scale_pos;
+ posa32[k * 3 + 2] = posa0[k * 4 + 2] / 32767 * parts[i].scale_pos;
for (let k: i32 = 0; k < Math.floor(posa1.length / 4); ++k) {
- posa32[voff * 3 + k * 3 ] = posa1[k * 4 ] / 32767 * parts[j].scalePos;
- posa32[voff * 3 + k * 3 + 1] = posa1[k * 4 + 1] / 32767 * parts[j].scalePos;
- posa32[voff * 3 + k * 3 + 2] = posa1[k * 4 + 2] / 32767 * parts[j].scalePos;
+ posa32[voff * 3 + k * 3 ] = posa1[k * 4 ] / 32767 * parts[j].scale_pos;
+ posa32[voff * 3 + k * 3 + 1] = posa1[k * 4 + 1] / 32767 * parts[j].scale_pos;
+ posa32[voff * 3 + k * 3 + 2] = posa1[k * 4 + 2] / 32767 * parts[j].scale_pos;
- let scalePos: f32 = 0.0;
+ let scale_pos: f32 = 0.0;
for (let k: i32 = 0; k < posa32.length; ++k) {
let f: f32 = Math.abs(posa32[k]);
- if (scalePos < f) scalePos = f;
+ if (scale_pos < f) scale_pos = f;
- let inv: f32 = 32767 * (1 / scalePos);
+ let inv: f32 = 32767 * (1 / scale_pos);
let posa: Int16Array = new Int16Array(posa0.length + posa1.length);
for (let k: i32 = 0; k < Math.floor(posa.length / 4); ++k) {
posa[k * 4 ] = Math.floor(posa32[k * 3 ] * inv);
@@ -100,7 +100,7 @@ class ImportObj {
parts[i].nora = nora;
parts[i].texa = texa;
parts[i].inda = inda;
- parts[i].scalePos = scalePos;
+ parts[i].scale_pos = scale_pos;
parts.splice(j, 1);
else j++;
@@ -2,15 +2,15 @@
class ImportPlugin {
- if (!Path.is_plugin(path)) {
+ if (!path_is_plugin(path)) {
- let dst_path: string = Path.data() + Path.sep + "plugins" + Path.sep + filename;
- File.copy(path, dst_path); // Copy to plugin folder
+ let dst_path: string = path_data() + path_sep + "plugins" + path_sep + filename;
+ file_copy(path, dst_path); // Copy to plugin folder
- Console.info(tr("Plugin imported:") + " " + filename);
+ console_info(tr("Plugin imported:") + " " + filename);
@@ -2,14 +2,14 @@
class ImportTexture {
static run = (path: string, hdr_as_envmap: bool = true) => {
- if (!Path.is_texture(path)) {
+ if (!path_is_texture(path)) {
- for (let a of Project.assets) {
+ for (let a of project_assets) {
// Already imported
if (a.file == path) {
// Set as envmap
@@ -19,27 +19,27 @@ class ImportTexture {
ImportEnvmap.run(path, image);
- let importer: (s: string, f: (img: image_t)=>void)=>void = Path.texture_importers.get(ext);
+ let importer: (s: string, f: (img: image_t)=>void)=>void = path_texture_importers.get(ext);
let cached: bool = data_cached_images.get(path) != null; // Already loaded or pink texture for missing file
if (importer == null || cached) importer = ImportTexture.default_importer;
importer(path, (image: image_t) => {
data_cached_images.set(path, image);
- let asset: asset_t = {name: name, file: path, id: Project.asset_id++};
- if (Context.raw.texture == null) Context.raw.texture = asset;
- Project.asset_names.push(name);
+ let asset: asset_t = {name: name, file: path, id: project_asset_id++};
+ if (context_raw.texture == null) context_raw.texture = asset;
+ project_asset_names.push(name);
- Console.info(tr("Texture imported:") + " " + name);
+ console_info(tr("Texture imported:") + " " + name);
if (hdr_as_envmap && path.toLowerCase().endsWith(".hdr")) {
@@ -2,18 +2,18 @@
class ImportTheme {
- let dst_path: string = Path.data() + Path.sep + "themes" + Path.sep + filename;
+ let dst_path: string = path_data() + path_sep + "themes" + path_sep + filename;
- Config.raw.theme = filename;
+ config_raw.theme = filename;
- Console.info(tr("Theme imported:") + " " + filename);
+ console_info(tr("Theme imported:") + " " + filename);
@@ -1,193 +0,0 @@
-class LineDraw {
- static color: color_t = 0xffff0000;
- static strength: f32 = 0.005;
- static mat: mat4_t = null;
- static dim: vec4_t = null;
- static vertex_buffer: vertex_buffer_t;
- static index_buffer: index_buffer_t;
- static pipeline: pipeline_t = null;
- static vp: mat4_t;
- static vp_loc: kinc_const_loc_t;
- static vb_data: DataView;
- static ib_data: Uint32Array;
- static max_lines: i32 = 300;
- static max_vertices: i32 = LineDraw.max_lines * 4;
- static max_indices: i32 = LineDraw.max_lines * 6;
- static lines: i32 = 0;
- static wpos: vec4_t;
- static vx: vec4_t = vec4_create();
- static vy: vec4_t = vec4_create();
- static vz: vec4_t = vec4_create();
- static v1: vec4_t = vec4_create();
- static v2: vec4_t = vec4_create();
- static t: vec4_t = vec4_create();
- static mid_point: vec4_t = vec4_create();
- static mid_line: vec4_t = vec4_create();
- static corner1: vec4_t = vec4_create();
- static corner2: vec4_t = vec4_create();
- static corner3: vec4_t = vec4_create();
- static corner4: vec4_t = vec4_create();
- static camera_look: vec4_t = vec4_create();
- static render = (matrix: mat4_t) => {
- LineDraw.mat = matrix;
- LineDraw.dim = mat4_get_scale(matrix);
- if (LineDraw.pipeline == null) {
- let structure: vertex_struct_t = g4_vertex_struct_create();
- g4_vertex_struct_add(structure, "pos", vertex_data_t.F32_3X);
- g4_vertex_struct_add(structure, "col", vertex_data_t.F32_3X);
- LineDraw.pipeline = g4_pipeline_create();
- LineDraw.pipeline.input_layout = [structure];
- LineDraw.pipeline.fragment_shader = sys_get_shader("line.frag");
- LineDraw.pipeline.vertex_shader = sys_get_shader("line.vert");
- LineDraw.pipeline.depth_write = true;
- LineDraw.pipeline.depth_mode = compare_mode_t.LESS;
- LineDraw.pipeline.cull_mode = cull_mode_t.NONE;
- LineDraw.pipeline.color_attachment_count = 3;
- LineDraw.pipeline.color_attachments[0] = tex_format_t.RGBA64;
- LineDraw.pipeline.color_attachments[1] = tex_format_t.RGBA64;
- LineDraw.pipeline.color_attachments[2] = tex_format_t.RGBA64;
- LineDraw.pipeline.depth_attachment = depth_format_t.DEPTH24;
- g4_pipeline_compile(LineDraw.pipeline);
- LineDraw.vp_loc = g4_pipeline_get_const_loc(LineDraw.pipeline, "VP");
- LineDraw.vp = mat4_identity();
- LineDraw.vertex_buffer = g4_vertex_buffer_create(LineDraw.max_vertices, structure, usage_t.DYNAMIC);
- LineDraw.index_buffer = g4_index_buffer_create(LineDraw.max_indices);
- LineDraw.begin();
- LineDraw.bounds(LineDraw.mat, LineDraw.dim);
- LineDraw.end();
- static bounds = (mat: mat4_t, dim: vec4_t) => {
- LineDraw.wpos = mat4_get_loc(mat);
- let dx: f32 = dim.x / 2;
- let dy: f32 = dim.y / 2;
- let dz: f32 = dim.z / 2;
- let up: vec4_t = mat4_up(mat);
- let look: vec4_t = mat4_look(mat);
- let right: vec4_t = mat4_right(mat);
- vec4_normalize(up);
- vec4_normalize(look);
- vec4_normalize(right);
- vec4_set_from(LineDraw.vx, right);
- vec4_mult(LineDraw.vx, dx);
- vec4_set_from(LineDraw.vy, look);
- vec4_mult(LineDraw.vy, dy);
- vec4_set_from(LineDraw.vz, up);
- vec4_mult(LineDraw.vz, dz);
- LineDraw.lineb(-1, -1, -1, 1, -1, -1);
- LineDraw.lineb(-1, 1, -1, 1, 1, -1);
- LineDraw.lineb(-1, -1, 1, 1, -1, 1);
- LineDraw.lineb(-1, 1, 1, 1, 1, 1);
- LineDraw.lineb(-1, -1, -1, -1, 1, -1);
- LineDraw.lineb(-1, -1, 1, -1, 1, 1);
- LineDraw.lineb( 1, -1, -1, 1, 1, -1);
- LineDraw.lineb( 1, -1, 1, 1, 1, 1);
- LineDraw.lineb(-1, -1, -1, -1, -1, 1);
- LineDraw.lineb(-1, 1, -1, -1, 1, 1);
- LineDraw.lineb( 1, -1, -1, 1, -1, 1);
- LineDraw.lineb( 1, 1, -1, 1, 1, 1);
- static lineb = (a: i32, b: i32, c: i32, d: i32, e: i32, f: i32) => {
- vec4_set_from(LineDraw.v1, LineDraw.wpos);
- vec4_set_from(LineDraw.t, LineDraw.vx); vec4_mult(LineDraw.t, a); vec4_add(LineDraw.v1, LineDraw.t);
- vec4_set_from(LineDraw.t, LineDraw.vy); vec4_mult(LineDraw.t, b); vec4_add(LineDraw.v1, LineDraw.t);
- vec4_set_from(LineDraw.t, LineDraw.vz); vec4_mult(LineDraw.t, c); vec4_add(LineDraw.v1, LineDraw.t);
- vec4_set_from(LineDraw.v2, LineDraw.wpos);
- vec4_set_from(LineDraw.t, LineDraw.vx); vec4_mult(LineDraw.t, d); vec4_add(LineDraw.v2, LineDraw.t);
- vec4_set_from(LineDraw.t, LineDraw.vy); vec4_mult(LineDraw.t, e); vec4_add(LineDraw.v2, LineDraw.t);
- vec4_set_from(LineDraw.t, LineDraw.vz); vec4_mult(LineDraw.t, f); vec4_add(LineDraw.v2, LineDraw.t);
- LineDraw.line(LineDraw.v1.x, LineDraw.v1.y, LineDraw.v1.z, LineDraw.v2.x, LineDraw.v2.y, LineDraw.v2.z);
- static line = (x1: f32, y1: f32, z1: f32, x2: f32, y2: f32, z2: f32) => {
- if (LineDraw.lines >= LineDraw.max_lines) {
- vec4_set(LineDraw.mid_point, x1 + x2, y1 + y2, z1 + z2);
- vec4_mult(LineDraw.mid_point, 0.5);
- vec4_set(LineDraw.mid_line, x1, y1, z1);
- vec4_sub(LineDraw.mid_line, LineDraw.mid_point);
- LineDraw.camera_look = mat4_get_loc(camera.base.transform.world);
- vec4_sub(LineDraw.camera_look, LineDraw.mid_point);
- let line_width: vec4_t = vec4_cross(LineDraw.camera_look, LineDraw.mid_line);
- vec4_normalize(line_width);
- vec4_mult(line_width, LineDraw.strength);
- vec4_add(vec4_set(LineDraw.corner1, x1, y1, z1), line_width);
- vec4_sub(vec4_set(LineDraw.corner2, x1, y1, z1), line_width);
- vec4_sub(vec4_set(LineDraw.corner3, x2, y2, z2), line_width);
- vec4_add(vec4_set(LineDraw.corner4, x2, y2, z2), line_width);
- let i: i32 = LineDraw.lines * 24; // 4 * 6 (structure len)
- LineDraw.add_vb_data(i, [LineDraw.corner1.x, LineDraw.corner1.y, LineDraw.corner1.z, color_get_rb(LineDraw.color) / 255, color_get_gb(LineDraw.color) / 255, color_get_ab(LineDraw.color) / 255]);
- i += 6;
- LineDraw.add_vb_data(i, [LineDraw.corner2.x, LineDraw.corner2.y, LineDraw.corner2.z, color_get_rb(LineDraw.color) / 255, color_get_gb(LineDraw.color) / 255, color_get_ab(LineDraw.color) / 255]);
- LineDraw.add_vb_data(i, [LineDraw.corner3.x, LineDraw.corner3.y, LineDraw.corner3.z, color_get_rb(LineDraw.color) / 255, color_get_gb(LineDraw.color) / 255, color_get_ab(LineDraw.color) / 255]);
- LineDraw.add_vb_data(i, [LineDraw.corner4.x, LineDraw.corner4.y, LineDraw.corner4.z, color_get_rb(LineDraw.color) / 255, color_get_gb(LineDraw.color) / 255, color_get_ab(LineDraw.color) / 255]);
- i = LineDraw.lines * 6;
- LineDraw.ib_data[i ] = LineDraw.lines * 4;
- LineDraw.ib_data[i + 1] = LineDraw.lines * 4 + 1;
- LineDraw.ib_data[i + 2] = LineDraw.lines * 4 + 2;
- LineDraw.ib_data[i + 3] = LineDraw.lines * 4 + 2;
- LineDraw.ib_data[i + 4] = LineDraw.lines * 4 + 3;
- LineDraw.ib_data[i + 5] = LineDraw.lines * 4;
- LineDraw.lines++;
- static begin = () => {
- LineDraw.lines = 0;
- LineDraw.vb_data = g4_vertex_buffer_lock(LineDraw.vertex_buffer);
- LineDraw.ib_data = g4_index_buffer_lock(LineDraw.index_buffer);
- static end = () => {
- g4_vertex_buffer_unlock(LineDraw.vertex_buffer);
- g4_index_buffer_unlock(LineDraw.index_buffer);
- g4_set_vertex_buffer(LineDraw.vertex_buffer);
- g4_set_index_buffer(LineDraw.index_buffer);
- g4_set_pipeline(LineDraw.pipeline);
- mat4_set_from(LineDraw.vp, camera.v);
- mat4_mult_mat(LineDraw.vp, camera.p);
- g4_set_mat(LineDraw.vp_loc, LineDraw.vp);
- g4_draw(0, LineDraw.lines * 6);
- static add_vb_data = (i: i32, data: f32[]) => {
- for (let offset: i32 = 0; offset < 6; ++offset) {
- LineDraw.vb_data.setFloat32((i + offset) * 4, data[offset], true);
@@ -1,78 +0,0 @@
-class MakeVoxel {
- ///if arm_voxels
- static run = (data: shader_context_t) => {
- g4_vertex_struct_add(structure, "pos", vertex_data_t.I16_4X_NORM);
- g4_vertex_struct_add(structure, "nor", vertex_data_t.I16_2X_NORM);
- g4_vertex_struct_add(structure, "tex", vertex_data_t.I16_2X_NORM);
- let pipe_state: pipeline_t = data._.pipe_state;
- pipe_state.input_layout = [structure];
- data.vertex_elements = [
- {name: "pos", data: "short4norm"},
- {name: "nor", data: "short2norm"},
- {name: "tex", data: "short2norm"}
- // ///if arm_skin
- // let is_mesh: bool = Context.raw.object.constructor == mesh_object_t;
- // let skin: bool = is_mesh && cast(Context.raw.object, mesh_object_t).data.geom.bones != null;
- // if (skin) {
- // VertexStructure.add(structure, "bone", VertexData.I16_4X_Normalized);
- // VertexStructure.add(structure, "weight", VertexData.I16_4X_Normalized);
- // data.raw.vertex_elements.push({ name: "bone", data: 'short4norm' });
- // data.raw.vertex_elements.push({ name: "weight", data: 'short4norm' });
- let ds: f32 = MakeMaterial.get_displace_strength();
- pipe_state.vertex_shader = g4_shader_from_source(MakeVoxel.voxel_source(), shader_type_t.VERTEX);
- g4_pipeline_compile(pipe_state);
- data.constants = [{ name: "W", type: "mat4", link: "_world_matrix" }, { name: "N", type: "mat3", link: "_normal_matrix" }];
- data._.constants = [g4_pipeline_get_const_loc(pipe_state, "W"), g4_pipeline_get_const_loc(pipe_state, "N")];
- data.texture_units = [{ name: "texpaint_pack" }, { name: "voxels", image_uniform: true }];
- data._.tex_units = [g4_pipeline_get_tex_unit(pipe_state, "texpaint_pack"), g4_pipeline_get_tex_unit(pipe_state, "voxels")];
- static voxel_source = (): string => {
- ///if krom_direct3d11
- return `#define vec3 float3
- uniform float4x4 W;
- uniform float3x3 N;
- Texture2D<float4> texpaint_pack;
- SamplerState _texpaint_pack_sampler;
- struct SPIRV_Cross_Input { float4 pos : TEXCOORD1; float2 nor : TEXCOORD0; float2 tex : TEXCOORD2; };
- struct SPIRV_Cross_Output { float4 svpos : SV_POSITION; };
- SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) {
- SPIRV_Cross_Output stage_output;
- " + MakeMaterial.voxelgiHalfExtents() + "
- stage_output.svpos.xyz = mul(float4(stage_input.pos.xyz, 1.0), W).xyz / voxelgiHalfExtents.xxx;
- float3 wnormal = normalize(mul(float3(stage_input.nor.xy, stage_input.pos.w), N));
- float height = texpaint_pack.SampleLevel(_texpaint_pack_sampler, stage_input.tex, 0.0).a;
- stage_output.svpos.xyz += wnormal * height.xxx * float3(" + ds + "," + ds + "," + ds + ");
- stage_output.svpos.w = 1.0;
- return stage_output;
- }`;
- return `#version 450
- in vec4 pos;
- in vec2 nor;
- in vec2 tex;
- out vec3 voxpositionGeom;
- uniform mat4 W;
- uniform mat3 N;
- uniform sampler2D texpaint_pack;
- void main() {
- voxpositionGeom = vec3(W * vec4(pos.xyz, 1.0)) / voxelgiHalfExtents;
- vec3 wnormal = normalize(N * vec3(nor.xy, pos.w));
- float height = textureLod(texpaint_pack, tex, 0.0).a;
- voxpositionGeom += wnormal * vec3(height) * vec3(" + ds + ");
@@ -1,4 +1,3 @@
-/// <reference path='./tr.ts'/>
class NodesMaterial {
@@ -2876,7 +2875,7 @@ class NodesMaterial {
node.name = tr("Group") + " " + i;
let found: bool = false;
found = true;
@@ -2927,11 +2926,11 @@ class NodesMaterial {
links: []
- Project.material_groups.push({ canvas: canvas, nodes: zui_nodes_create() });
+ project_material_groups.push({ canvas: canvas, nodes: zui_nodes_create() });
let group: node_group_t = null;
group = g;
@@ -2975,8 +2974,8 @@ class NodesMaterial {
static sync_sockets = (node: zui_node_t) => {
let groupStack: node_group_t[] = UINodes.group_stack;
let c: zui_node_canvas_t = groupStack[groupStack.length - 1].canvas;
- for (let m of Project.materials) NodesMaterial.sync_group_sockets(m.canvas, c.name, node);
- for (let g of Project.material_groups) NodesMaterial.sync_group_sockets(g.canvas, c.name, node);
+ for (let m of project_materials) NodesMaterial.sync_group_sockets(m.canvas, c.name, node);
+ for (let g of project_material_groups) NodesMaterial.sync_group_sockets(g.canvas, c.name, node);
zui_node_replace.push(node);
@@ -3031,8 +3030,8 @@ class NodesMaterial {
static create_node = (nodeType: string, group: node_group_t = null): zui_node_t => {
let n: zui_node_t = NodesMaterial.get_node_t(nodeType);
if (n == null) return null;
- let canvas: zui_node_canvas_t = group != null ? group.canvas : Context.raw.material.canvas;
- let nodes: zui_nodes_t = group != null ? group.nodes : Context.raw.material.nodes;
+ let canvas: zui_node_canvas_t = group != null ? group.canvas : context_raw.material.canvas;
+ let nodes: zui_nodes_t = group != null ? group.nodes : context_raw.material.nodes;
@@ -1,49 +0,0 @@
-class Operator {
- static ops: Map<string, any> = new Map();
- static register = (name: string, call: any) => {
- Operator.ops.set(name, call);
- static run = (name: string) => {
- if (Operator.ops.get(name) != null) Operator.ops.get(name)();
- if (mouse_started_any() || keyboard_started_any()) {
- for (let op in Config.keymap) {
- if (Operator.shortcut(Config.keymap[op])) Operator.run(op);
- static shortcut = (s: string, type = ShortcutType.ShortcutStarted): bool => {
- if (s == "") return false;
- let shift: bool = s.indexOf("shift") >= 0;
- let ctrl: bool = s.indexOf("ctrl") >= 0;
- let alt: bool = s.indexOf("alt") >= 0;
- let flag: bool = shift == keyboard_down("shift") &&
- ctrl == keyboard_down("control") &&
- alt == keyboard_down("alt");
- if (s.indexOf("+") > 0) {
- s = s.substr(s.lastIndexOf("+") + 1);
- if (s == "number") return flag;
- else if (shift || ctrl || alt) return flag;
- let key: bool = (s == "left" || s == "right" || s == "middle") ?
- // Mouse
- (type == ShortcutType.ShortcutDown ? mouse_down(s) : mouse_started(s)) :
- // Keyboard
- (type == ShortcutType.ShortcutRepeat ? keyboard_repeat(s) : type == ShortcutType.ShortcutDown ? keyboard_down(s) : type == ShortcutType.ShortcutReleased ? keyboard_released(s) : keyboard_started(s));
- return flag && key;
-enum ShortcutType {
- ShortcutStarted,
- ShortcutRepeat,
- ShortcutDown,
- ShortcutReleased,
@@ -206,7 +206,7 @@ class ParserMaterial {
if (frag.wtangent) {
- // NodeShaderContext.add_elem(con, "tang", "short4norm");
+ // NodeShaderadd_elem(con, "tang", "short4norm");
// NodeShader.add_uniform(vert, "mat3 N", "_normal_matrix");
NodeShader.add_out(vert, "vec3 wtangent");
// NodeShader.write_attrib(vert, `wtangent = normalize(mul(tang.xyz, N));`);
@@ -268,7 +268,7 @@ class ParserMaterial {
static get_group = (name: string): zui_node_canvas_t => {
- for (let g of Project.material_groups) if (g.canvas.name == name) return g.canvas;
+ for (let g of project_material_groups) if (g.canvas.name == name) return g.canvas;
return null;
@@ -784,8 +784,8 @@ class ParserMaterial {
else if (node.type == "MATERIAL") {
let result: string = "vec3(0.0, 0.0, 0.0)";
let mi: any = node.buttons[0].default_value;
- if (mi >= Project.materials.length) return result;
- let m: SlotMaterialRaw = Project.materials[mi];
+ if (mi >= project_materials.length) return result;
+ let m: SlotMaterialRaw = project_materials[mi];
let _nodes: zui_node_t[] = ParserMaterial.nodes;
let _links: zui_node_link_t[] = ParserMaterial.links;
ParserMaterial.nodes = m.canvas.nodes;
@@ -1203,8 +1203,8 @@ class ParserMaterial {
let result: string = "0.0";
@@ -1865,7 +1865,7 @@ class ParserMaterial {
static enum_data = (s: string): string => {
- for (let a of Project.assets) if (a.name == s) return a.file;
+ for (let a of project_assets) if (a.name == s) return a.file;
return "";
@@ -1880,7 +1880,7 @@ class ParserMaterial {
file: filepath
- if (Context.raw.texture_filter) {
+ if (context_raw.texture_filter) {
tex.min_filter = "anisotropic";
tex.mag_filter = "linear";
tex.mipmap_filter = "linear";
@@ -1,177 +0,0 @@
-class Path {
- static get sep(): string {
- return "\\";
- return "/";
- static mesh_formats: string[] = ["obj", "blend"];
- static texture_formats: string[] = ["jpg", "jpeg", "png", "tga", "bmp", "psd", "gif", "hdr", "k"];
- static mesh_importers: Map<string, (s: string, f: (a: any)=>void)=>void> = new Map();
- static texture_importers: Map<string, (s: string, f: (img: image_t)=>void)=>void> = new Map();
- static base_color_ext: string[] = ["albedo", "alb", "basecol", "basecolor", "diffuse", "diff", "base", "bc", "d", "color", "col"];
- static opacity_ext: string[] = ["opac", "opacity", "alpha"];
- static normal_map_ext: string[] = ["normal", "nor", "n", "nrm", "normalgl"];
- static occlusion_ext: string[] = ["ao", "occlusion", "ambientOcclusion", "o", "occ"];
- static roughness_ext: string[] = ["roughness", "rough", "r", "rgh"];
- static metallic_ext: string[] = ["metallic", "metal", "metalness", "m", "met"];
- static displacement_ext: string[] = ["displacement", "height", "h", "disp"];
- static working_dir_cache: string = null;
- static data = (): string => {
- return krom_get_files_location() + Path.sep + data_path();
- static to_relative = (from: string, to: string): string => {
- let a: string[] = from.split(Path.sep);
- let b: string[] = to.split(Path.sep);
- while (a[0] == b[0]) {
- a.shift();
- b.shift();
- if (a.length == 0 || b.length == 0) break;
- let base: string = "";
- for (let i: i32 = 0; i < a.length - 1; ++i) base += ".." + Path.sep;
- base += b.join(Path.sep);
- return base;
- static normalize = (path: string): string => {
- let i: i32 = 0;
- while (i < ar.length) {
- if (i > 0 && ar[i] == ".." && ar[i - 1] != "..") {
- ar.splice(i - 1, 2);
- i--;
- else i++;
- return ar.join(Path.sep);
- static base_dir = (path: string): string => {
- return path.substr(0, path.lastIndexOf(Path.sep) + 1);
- static get pwd(): string {
- return "cd";
- return "echo $PWD";
- static working_dir = (): string => {
- if (Path.working_dir_cache == null) {
- let cmd: string = Path.pwd;
- let save: string = (Path.is_protected() ? krom_save_path() : Path.data() + Path.sep) + "working_dir.txt";
- krom_sys_command(cmd + ' > "' + save + '"');
- Path.working_dir_cache = trim_end(sys_buffer_to_string(krom_load_blob(save)));
- return Path.working_dir_cache;
- static is_mesh = (path: string): bool => {
- let p: string = path.toLowerCase();
- for (let s of Path.mesh_formats) if (p.endsWith("." + s)) return true;
- static is_texture = (path: string): bool => {
- for (let s of Path.texture_formats) if (p.endsWith("." + s)) return true;
- static is_font = (path: string): bool => {
- return p.endsWith(".ttf") ||
- p.endsWith(".ttc") ||
- p.endsWith(".otf");
- static is_project = (path: string): bool => {
- return p.endsWith(".arm");
- static is_plugin = (path: string): bool => {
- return p.endsWith(".js");
- static is_json = (path: string): bool => {
- return p.endsWith(".json");
- static is_text = (path: string): bool => {
- return p.endsWith(".txt");
- static is_gimp_color_palette = (path: string): bool => {
- return p.endsWith(".gpl");
- static is_known = (path: string): bool => {
- return Path.is_mesh(path) || Path.is_texture(path) || Path.is_font(path) || Path.is_project(path) || Path.is_plugin(path) || Path.is_text(path) || Path.is_gimp_color_palette(path);
- static check_ext = (p: string, exts: string[]): bool => {
- p = string_replace_all(p, "-", "_");
- for (let ext of exts) {
- if (p.endsWith("_" + ext) ||
- (p.indexOf("_" + ext + "_") >= 0 && !p.endsWith("_preview") && !p.endsWith("_icon"))) {
- static is_base_color_tex = (p: string): bool => {
- return Path.check_ext(p, Path.base_color_ext);
- static is_opacity_tex = (p: string): bool => {
- return Path.check_ext(p, Path.opacity_ext);
- static is_normal_map_tex = (p: string): bool => {
- return Path.check_ext(p, Path.normal_map_ext);
- static is_occlusion_tex = (p: string): bool => {
- return Path.check_ext(p, Path.occlusion_ext);
- static is_roughness_tex = (p: string): bool => {
- return Path.check_ext(p, Path.roughness_ext);
- static is_metallic_tex = (p: string): bool => {
- return Path.check_ext(p, Path.metallic_ext);
- static is_displacement_tex = (p: string): bool => {
- return Path.check_ext(p, Path.displacement_ext);
- static is_folder = (p: string): bool => {
- return string_replace_all(p, "\\", "/").split("/").pop().indexOf(".") == -1;
- static is_protected = (): bool => {
- return krom_get_files_location().indexOf("Program Files") >= 0;
- ///elseif krom_android
- ///elseif krom_ios
@@ -1,43 +0,0 @@
-class PluginRaw {
- draw_ui: (ui: zui_t)=>void = null;
- draw: ()=>void = null;
- update: ()=>void = null;
- delete: ()=>void = null;
- version: string = "0.1";
- apiversion: string = "0.1";
- name: string;
-class Plugin {
- static plugins: Map<string, PluginRaw> = new Map();
- static plugin_name: string;
- static create(): PluginRaw {
- let p: PluginRaw = new PluginRaw();
- p.name = Plugin.plugin_name;
- Plugin.plugins.set(p.name, p);
- return p;
- static start = (plugin: string) => {
- let blob: ArrayBuffer = data_get_blob("plugins/" + plugin);
- Plugin.plugin_name = plugin;
- // (1, eval)(sys_buffer_to_string(blob)); // Global scope
- eval(sys_buffer_to_string(blob)); // Local scope
- data_delete_blob("plugins/" + plugin);
- Console.error(tr("Failed to load plugin") + " '" + plugin + "'");
- static stop = (plugin: string) => {
- let p: PluginRaw = Plugin.plugins.get(plugin);
- if (p != null && p.delete != null) p.delete();
- Plugin.plugins.delete(plugin);
@@ -1,640 +0,0 @@
-class Project {
- static raw: project_format_t = {};
- static filepath: string = "";
- static assets: asset_t[] = [];
- static asset_names: string[] = [];
- static asset_id: i32 = 0;
- static mesh_assets: string[] = [];
- static material_groups: node_group_t[] = [];
- static paint_objects: mesh_object_t[] = null;
- static asset_map: Map<i32, any> = new Map(); // ImageRaw | FontRaw
- static mesh_list: string[] = null;
- static materials: SlotMaterialRaw[] = null;
- static brushes: SlotBrushRaw[] = null;
- static layers: SlotLayerRaw[] = null;
- static fonts: SlotFontRaw[] = null;
- static atlas_objects: i32[] = null;
- static atlas_names: string[] = null;
- static material_data: material_data_t = null; ////
- static materials: any[] = null; ////
- static nodes: zui_nodes_t;
- static canvas: zui_node_canvas_t;
- static default_canvas: ArrayBuffer = null;
- static project_open = () => {
- UIFiles.show("arm", false, false, (path: string) => {
- if (!path.endsWith(".arm")) {
- Console.error(Strings.error0());
- ImportArm.run_project(path);
- static project_save = (saveAndQuit: bool = false) => {
- if (Project.filepath == "") {
- let document_directory: string = krom_save_dialog("", "");
- document_directory = document_directory.substr(0, document_directory.length - 8); // Strip /'untitled'
- Project.filepath = document_directory + "/" + sys_title() + ".arm";
- Project.filepath = krom_save_path() + "/" + sys_title() + ".arm";
- Project.project_save_as(saveAndQuit);
- let filename: string = Project.filepath.substring(Project.filepath.lastIndexOf(Path.sep) + 1, Project.filepath.length - 4);
- sys_title_set(filename + " - " + manifest_title);
- let _init = () => {
- ExportArm.run_project();
- if (saveAndQuit) sys_stop();
- app_notify_on_init(_init);
- static project_save_as = (saveAndQuit: bool = false) => {
- UIFiles.show("arm", true, false, (path: string) => {
- let f: string = UIFiles.filename;
- if (f == "") f = tr("untitled");
- Project.filepath = path + Path.sep + f;
- if (!Project.filepath.endsWith(".arm")) Project.filepath += ".arm";
- Project.project_save(saveAndQuit);
- static project_new_box = () => {
- UIBox.show_custom((ui: zui_t) => {
- if (zui_tab(zui_handle("project_0"), tr("New Project"))) {
- if (Project.mesh_list == null) {
- Project.mesh_list = File.read_directory(Path.data() + Path.sep + "meshes");
- for (let i: i32 = 0; i < Project.mesh_list.length; ++i) Project.mesh_list[i] = Project.mesh_list[i].substr(0, Project.mesh_list[i].length - 4); // Trim .arm
- Project.mesh_list.unshift("plane");
- Project.mesh_list.unshift("sphere");
- Project.mesh_list.unshift("rounded_cube");
- zui_row([0.5, 0.5]);
- Context.raw.project_type = zui_combo(zui_handle("project_1", { position: Context.raw.project_type }), Project.mesh_list, tr("Template"), true);
- Context.raw.project_aspect_ratio = zui_combo(zui_handle("project_2", { position: Context.raw.project_aspect_ratio }), ["1:1", "2:1", "1:2"], tr("Aspect Ratio"), true);
- zui_end_element();
- if (zui_button(tr("Cancel"))) {
- UIBox.hide();
- if (zui_button(tr("OK")) || ui.is_return_down) {
- static project_new = (resetLayers: bool = true) => {
- sys_title_set(manifest_title);
- Project.filepath = "";
- data_delete_mesh(Context.raw.merged_object.data._.handle);
- Project.mesh_assets = [];
- Viewport.reset();
- for (let i: i32 = 1; i < Project.paint_objects.length; ++i) {
- data_delete_mesh(p.data._.handle);
- mesh_object_remove(p);
- let meshes: mesh_object_t[] = scene_meshes;
- let len: i32 = meshes.length;
- for (let i: i32 = 0; i < len; ++i) {
- let m: mesh_object_t = meshes[len - i - 1];
- if (Context.raw.project_objects.indexOf(m) == -1 &&
- m.base.name != ".ParticleEmitter" &&
- m.base.name != ".Particle") {
- data_delete_mesh(m.data._.handle);
- mesh_object_remove(m);
- if (handle != "SceneSphere" && handle != "ScenePlane") {
- data_delete_mesh(handle);
- if (Context.raw.project_type != project_model_t.ROUNDED_CUBE) {
- let raw: mesh_data_t = null;
- if (Context.raw.project_type == project_model_t.SPHERE || Context.raw.project_type == project_model_t.TESSELLATED_PLANE) {
- let mesh: any = Context.raw.project_type == project_model_t.SPHERE ?
- Geom.make_uv_sphere(1, 512, 256) :
- Geom.make_plane(1, 1, 512, 512);
- mesh.name = "Tessellated";
- raw = ImportMesh.raw_mesh(mesh);
- let f32a: Float32Array = new Float32Array(Config.get_texture_res_x() * Config.get_texture_res_y() * 4);
- for (let i: i32 = 0; i < Math.floor(mesh.inda.length); ++i) {
- let index: i32 = mesh.inda[i];
- f32a[i * 4] = mesh.posa[index * 4] / 32767;
- f32a[i * 4 + 1] = mesh.posa[index * 4 + 1] / 32767;
- f32a[i * 4 + 2] = mesh.posa[index * 4 + 2] / 32767;
- f32a[i * 4 + 3] = 1.0;
- let imgmesh: image_t = image_from_bytes(f32a.buffer, Config.get_texture_res_x(), Config.get_texture_res_y(), tex_format_t.RGBA128);
- let texpaint: image_t = Project.layers[0].texpaint;
- g2_begin(texpaint);
- g2_set_pipeline(base_pipe_copy128);
- g2_draw_scaled_image(imgmesh, 0, 0, Config.get_texture_res_x(), Config.get_texture_res_y());
- g2_set_pipeline(null);
- g2_end();
- let b: ArrayBuffer = data_get_blob("meshes/" + Project.mesh_list[Context.raw.project_type] + ".arm");
- raw = armpack_decode(b).mesh_datas[0];
- let md: mesh_data_t = mesh_data_create(raw);
- data_cached_meshes.set("SceneTessellated", md);
- if (Context.raw.project_type == project_model_t.TESSELLATED_PLANE) {
- Viewport.set_view(0, 0, 0.75, 0, 0, 0); // Top
- let n: string = Context.raw.project_type == project_model_t.ROUNDED_CUBE ? ".Cube" : "Tessellated";
- let md: mesh_data_t = data_get_mesh("Scene", n);
- Context.raw.picker_mask_handle.position = picker_mask_t.NONE;
- Context.raw.paint_object.base.name = n;
- while (Project.materials.length > 0) SlotMaterial.unload(Project.materials.pop());
- let m: material_data_t = data_get_material("Scene", "Material");
- Project.materials.push(SlotMaterial.create(m));
- Project.material_data = m;
- Context.raw.material = Project.materials[0];
- Project.brushes = [SlotBrush.create()];
- Context.raw.brush = Project.brushes[0];
- Project.fonts = [SlotFont.create("default.ttf", base_font)];
- Context.raw.font = Project.fonts[0];
- Project.set_default_swatches();
- Context.raw.swatch = Project.raw.swatches[0];
- Context.raw.picked_color = Project.make_swatch();
- Context.raw.color_picker_callback = null;
- UtilRender.make_material_preview();
- for (let a of Project.assets) data_delete_image(a.file);
- Project.assets = [];
- Project.asset_names = [];
- Project.asset_map = new Map();
- Project.asset_id = 0;
- if (resetLayers) {
- let aspect_ratio_changed: bool = Project.layers[0].texpaint.width != Config.get_texture_res_x() || Project.layers[0].texpaint.height != Config.get_texture_res_y();
- while (Project.layers.length > 0) SlotLayer.unload(Project.layers.pop());
- let layer: SlotLayerRaw = SlotLayer.create();
- Project.layers.push(layer);
- Context.set_layer(layer);
- if (aspect_ratio_changed) {
- app_notify_on_init(base_resize_layers);
- app_notify_on_init(base_init_layers);
- Context.raw.saved_envmap = null;
- Context.raw.envmap_loaded = false;
- scene_world.envmap = "World_radiance.k";
- Context.raw.show_envmap_handle.selected = Context.raw.show_envmap = false;
- scene_world._.radiance = Context.raw.default_radiance;
- scene_world._.radiance_mipmaps = Context.raw.default_radiance_mipmaps;
- scene_world._.irradiance = Context.raw.default_irradiance;
- scene_world.strength = 4.0;
- static import_material = () => {
- UIFiles.show("arm,blend", false, true, (path: string) => {
- path.endsWith(".blend") ?
- ImportBlendMaterial.run(path) :
- ImportArm.run_material(path);
- static import_brush = () => {
- UIFiles.show("arm," + Path.texture_formats.join(","), false, true, (path: string) => {
- // Create brush from texture
- if (Path.is_texture(path)) {
- // Import texture
- ImportAsset.run(path);
- let asset_index: i32 = 0;
- asset_index = i;
- break;
- // Create a new brush
- Context.raw.brush = SlotBrush.create();
- // Create and link image node
- let n: zui_node_t = NodesBrush.create_node("TEX_IMAGE");
- n.x = 83;
- n.y = 340;
- n.buttons[0].default_value = asset_index;
- let links: zui_node_link_t[] = Context.raw.brush.canvas.links;
- links.push({
- id: zui_get_link_id(links),
- from_id: n.id,
- from_socket: 0,
- to_id: 0,
- to_socket: 4
- // Parse brush
- UtilRender.make_brush_preview();
- // Import from project file
- ImportArm.run_brush(path);
- static import_mesh = (replaceExisting: bool = true, done: ()=>void = null) => {
- UIFiles.show(Path.mesh_formats.join(","), false, false, (path: string) => {
- Project.import_mesh_box(path, replaceExisting, true, done);
- static import_mesh_box = (path: string, replaceExisting: bool = true, clearLayers: bool = true, done: ()=>void = null) => {
- // Import immediately while access to resource is unlocked
- // data_get_blob(path, (b: Blob) => {});
- if (zui_tab(zui_handle("project_3"), tr("Import Mesh"), tab_vertical)) {
- if (path.toLowerCase().endsWith(".obj")) {
- Context.raw.split_by = zui_combo(zui_handle("project_4"), [
- tr("Object"),
- tr("Group"),
- tr("Material"),
- tr("UDIM Tile"),
- ], tr("Split By"), true);
- if (ui.is_hovered) zui_tooltip(tr("Split .obj mesh into objects"));
- // if (path.toLowerCase().endsWith(".fbx")) {
- // Context.raw.parseTransform = Zui.check(Zui.handle("project_5", { selected: Context.raw.parseTransform }), tr("Parse Transforms"));
- // if (ui.isHovered) Zui.tooltip(tr("Load per-object transforms from .fbx"));
- // if (path.toLowerCase().endsWith(".fbx") || path.toLowerCase().endsWith(".blend")) {
- if (path.toLowerCase().endsWith(".blend")) {
- Context.raw.parse_vcols = zui_check(zui_handle("project_6", { selected: Context.raw.parse_vcols }), tr("Parse Vertex Colors"));
- if (ui.is_hovered) zui_tooltip(tr("Import vertex color data"));
- zui_row([0.45, 0.45, 0.1]);
- if (zui_button(tr("Import")) || ui.is_return_down) {
- let do_import = () => {
- ImportMesh.run(path, clearLayers, replaceExisting);
- ImportMesh.run(path, replaceExisting);
- if (done != null) done();
- Console.toast(tr("Importing mesh"));
- base_notify_on_next_frame(do_import);
- do_import();
- if (zui_button(tr("?"))) {
- File.load_url("https://github.com/armory3d/armorpaint_docs/blob/master/faq.md");
- UIBox.click_to_hide = false; // Prevent closing when going back to window from file browser
- static reimport_mesh = () => {
- if (Project.mesh_assets != null && Project.mesh_assets.length > 0 && File.exists(Project.mesh_assets[0])) {
- Project.import_mesh_box(Project.mesh_assets[0], true, false);
- else Project.import_asset();
- static unwrap_mesh_box = (mesh: any, done: (a: any)=>void, skipUI: bool = false) => {
- if (zui_tab(zui_handle("project_7"), tr("Unwrap Mesh"), tab_vertical)) {
- let unwrapPlugins: string[] = [];
- if (f.indexOf("uv_unwrap") >= 0 && f.endsWith(".js")) {
- unwrapPlugins.push(f);
- unwrapPlugins.push("equirect");
- let unwrap_by: i32 = zui_combo(zui_handle("project_8"), unwrapPlugins, tr("Plugin"), true);
- if (zui_button(tr("Unwrap")) || ui.is_return_down || skipUI) {
- let do_unwrap = () => {
- if (unwrap_by == unwrapPlugins.length - 1) {
- UtilMesh.equirect_unwrap(mesh);
- let f: string = unwrapPlugins[unwrap_by];
- if (Config.raw.plugins.indexOf(f) == -1) {
- UtilMesh.unwrappers.get(f)(mesh);
- done(mesh);
- Console.toast(tr("Unwrapping mesh"));
- base_notify_on_next_frame(do_unwrap);
- do_unwrap();
- static import_asset = (filters: string = null, hdrAsEnvmap: bool = true) => {
- if (filters == null) filters = Path.texture_formats.join(",") + "," + Path.mesh_formats.join(",");
- UIFiles.show(filters, false, true, (path: string) => {
- ImportAsset.run(path, -1.0, -1.0, true, hdrAsEnvmap);
- static import_swatches = (replaceExisting: bool = false) => {
- UIFiles.show("arm,gpl", false, false, (path: string) => {
- if (Path.is_gimp_color_palette(path)) ImportGpl.run(path, replaceExisting);
- else ImportArm.run_swatches(path, replaceExisting);
- static reimport_textures = () => {
- for (let asset of Project.assets) {
- Project.reimport_texture(asset);
- static reimport_texture = (asset: asset_t) => {
- let load = (path: string) => {
- asset.file = path;
- let i: i32 = Project.assets.indexOf(asset);
- data_delete_image(asset.file);
- Project.asset_map.delete(asset.id);
- let old_asset: asset_t = Project.assets[i];
- Project.assets.splice(i, 1);
- Project.asset_names.splice(i, 1);
- ImportTexture.run(asset.file);
- Project.assets.splice(i, 0, Project.assets.pop());
- Project.asset_names.splice(i, 0, Project.asset_names.pop());
- if (Context.raw.texture == old_asset) Context.raw.texture = Project.assets[i];
- if (!File.exists(asset.file)) {
- let filters: string = Path.texture_formats.join(",");
- UIFiles.show(filters, false, false, (path: string) => {
- load(path);
- else load(asset.file);
- static get_image = (asset: asset_t): image_t => {
- return asset != null ? Project.asset_map.get(asset.id) : null;
- static get_used_atlases = (): string[] => {
- if (Project.atlas_objects == null) return null;
- let used: i32[] = [];
- for (let i of Project.atlas_objects) if (used.indexOf(i) == -1) used.push(i);
- if (used.length > 1) {
- let res: string[] = [];
- for (let i of used) res.push(Project.atlas_names[i]);
- return res;
- else return null;
- static is_atlas_object = (p: mesh_object_t): bool => {
- if (Context.raw.layer_filter <= Project.paint_objects.length) return false;
- let atlas_name: string = Project.get_used_atlases()[Context.raw.layer_filter - Project.paint_objects.length - 1];
- let atlas_i: i32 = Project.atlas_names.indexOf(atlas_name);
- return atlas_i == Project.atlas_objects[Project.paint_objects.indexOf(p)];
- static get_atlas_objects = (objectMask: i32): mesh_object_t[] => {
- let atlas_name: string = Project.get_used_atlases()[objectMask - Project.paint_objects.length - 1];
- let visibles: mesh_object_t[] = [];
- for (let i: i32 = 0; i < Project.paint_objects.length; ++i) if (Project.atlas_objects[i] == atlas_i) visibles.push(Project.paint_objects[i]);
- return visibles;
- static packed_asset_exists = (packed_assets: packed_asset_t[], name: string): bool => {
- for (let pa of packed_assets) if (pa.name == name) return true;
- static export_swatches = () => {
- UIFiles.show("arm,gpl", true, false, (path: string) => {
- if (Path.is_gimp_color_palette(f)) ExportGpl.run(path + Path.sep + f, f.substring(0, f.lastIndexOf(".")), Project.raw.swatches);
- else ExportArm.run_swatches(path + Path.sep + f);
- static make_swatch = (base: i32 = 0xffffffff): swatch_color_t => {
- return { base: base, opacity: 1.0, occlusion: 1.0, roughness: 0.0, metallic: 0.0, normal: 0xff8080ff, emission: 0.0, height: 0.0, subsurface: 0.0 };
- static clone_swatch = (swatch: swatch_color_t): swatch_color_t => {
- return { base: swatch.base, opacity: swatch.opacity, occlusion: swatch.occlusion, roughness: swatch.roughness, metallic: swatch.metallic, normal: swatch.normal, emission: swatch.emission, height: swatch.height, subsurface: swatch.subsurface };
- static set_default_swatches = () => {
- // 32-Color Palette by Andrew Kensler
- // http://eastfarthing.com/blog/2016-05-06-palette/
- let colors: i32[] = [0xffffffff, 0xff000000, 0xffd6a090, 0xffa12c32, 0xfffa2f7a, 0xfffb9fda, 0xffe61cf7, 0xff992f7c, 0xff47011f, 0xff051155, 0xff4f02ec, 0xff2d69cb, 0xff00a6ee, 0xff6febff, 0xff08a29a, 0xff2a666a, 0xff063619, 0xff4a4957, 0xff8e7ba4, 0xffb7c0ff, 0xffacbe9c, 0xff827c70, 0xff5a3b1c, 0xffae6507, 0xfff7aa30, 0xfff4ea5c, 0xff9b9500, 0xff566204, 0xff11963b, 0xff51e113, 0xff08fdcc];
- for (let c of colors) Project.raw.swatches.push(Project.make_swatch(c));
- static get_material_group_by_name = (groupName: string): node_group_t => {
- for (let g of Project.material_groups) if (g.canvas.name == groupName) return g;
- static is_material_group_in_use = (group: node_group_t): bool => {
- let canvases: zui_node_canvas_t[] = [];
- for (let m of Project.materials) canvases.push(m.canvas);
- for (let m of Project.material_groups) canvases.push(m.canvas);
- for (let canvas of canvases) {
- for (let n of canvas.nodes) {
- if (n.type == "GROUP" && n.name == group.canvas.name) {
-type node_group_t = {
- nodes?: zui_nodes_t;
- canvas?: zui_node_canvas_t;
@@ -14,12 +14,12 @@ class RenderPathBase {
- RenderPathBase.super_sample = Config.raw.rp_supersample;
+ RenderPathBase.super_sample = config_raw.rp_supersample;
static init_voxels = (targetName: string = "voxels") => {
- if (Config.raw.rp_gi != true || RenderPathBase.voxels_created) return;
+ if (config_raw.rp_gi != true || RenderPathBase.voxels_created) return;
RenderPathBase.voxels_created = true;
@@ -37,8 +37,8 @@ class RenderPathBase {
static apply_config = () => {
- if (RenderPathBase.super_sample != Config.raw.rp_supersample) {
+ if (RenderPathBase.super_sample != config_raw.rp_supersample) {
for (let rt of render_path_render_targets.values()) {
if (rt.width == 0 && rt.scale != null) {
rt.scale = RenderPathBase.super_sample;
@@ -56,7 +56,7 @@ class RenderPathBase {
static draw_compass = () => {
- if (Context.raw.show_compass) {
+ if (context_raw.show_compass) {
let compass: mesh_object_t = scene_get_child(".Compass").ext;
@@ -88,36 +88,36 @@ class RenderPathBase {
// Begin split
- if (Context.raw.split_view && !Context.raw.paint2d_view) {
- if (Context.raw.view_index_last == -1 && Context.raw.view_index == -1) {
+ if (context_raw.split_view && !context_raw.paint2d_view) {
+ if (context_raw.view_index_last == -1 && context_raw.view_index == -1) {
// Begin split, draw right viewport first
- Context.raw.view_index = 1;
+ context_raw.view_index = 1;
// Set current viewport
- if (Context.raw.view_index_last > -1) {
+ if (context_raw.view_index_last > -1) {
// Save current viewport camera
- mat4_set_from(Camera.views[Context.raw.view_index_last], cam.base.transform.local);
+ mat4_set_from(camera_views[context_raw.view_index_last], cam.base.transform.local);
- if (Context.raw.view_index_last != Context.raw.view_index || decal || !Config.raw.brush_3d) {
+ if (context_raw.view_index_last != context_raw.view_index || decal || !config_raw.brush_3d) {
// Redraw on current viewport change
- Context.raw.ddirty = 1;
+ context_raw.ddirty = 1;
- transform_set_matrix(cam.base.transform, Camera.views[Context.raw.view_index]);
+ transform_set_matrix(cam.base.transform, camera_views[context_raw.view_index]);
camera_object_build_mat(cam);
// Match projection matrix jitter
- let skip_taa: bool = Context.raw.split_view || ((Context.raw.tool == workspace_tool_t.CLONE || Context.raw.tool == workspace_tool_t.BLUR || Context.raw.tool == workspace_tool_t.SMUDGE) && Context.raw.pdirty > 0);
+ let skip_taa: bool = context_raw.split_view || ((context_raw.tool == workspace_tool_t.CLONE || context_raw.tool == workspace_tool_t.BLUR || context_raw.tool == workspace_tool_t.SMUDGE) && context_raw.pdirty > 0);
scene_camera.frame = skip_taa ? 0 : RenderPathBase.taa_frame;
camera_object_proj_jitter(scene_camera);
@@ -125,19 +125,19 @@ class RenderPathBase {
// End split
- Context.raw.view_index_last = Context.raw.view_index;
+ context_raw.view_index_last = context_raw.view_index;
- if (Context.raw.foreground_event && !mouse_down()) {
- Context.raw.foreground_event = false;
+ if (context_raw.foreground_event && !mouse_down()) {
+ context_raw.foreground_event = false;
RenderPathBase.taa_frame++;
static ssaa4 = (): bool => {
- return Config.raw.rp_supersample == 4;
+ return config_raw.rp_supersample == 4;
static is_cached = (): bool => {
@@ -148,12 +148,12 @@ class RenderPathBase {
RenderPathBase.last_x = mouse_view_x();
RenderPathBase.last_y = mouse_view_y();
- if (Context.raw.ddirty <= 0 && Context.raw.rdirty <= 0 && Context.raw.pdirty <= 0) {
- if (mx != RenderPathBase.last_x || my != RenderPathBase.last_y || mouse_locked) Context.raw.ddirty = 0;
+ if (context_raw.ddirty <= 0 && context_raw.rdirty <= 0 && context_raw.pdirty <= 0) {
+ if (mx != RenderPathBase.last_x || my != RenderPathBase.last_y || mouse_locked) context_raw.ddirty = 0;
///if (krom_metal || krom_android)
- if (Context.raw.ddirty > -6) {
+ if (context_raw.ddirty > -6) {
- if (Context.raw.ddirty > -2) {
+ if (context_raw.ddirty > -2) {
render_path_bind_target("taa", "tex");
@@ -161,7 +161,7 @@ class RenderPathBase {
render_path_draw_shader("shader_datas/supersample_resolve/supersample_resolve") :
- if (Context.raw.ddirty <= 0) Context.raw.ddirty--;
+ if (context_raw.ddirty <= 0) context_raw.ddirty--;
RenderPathBase.end();
@@ -179,9 +179,9 @@ class RenderPathBase {
RenderPathPaint.draw();
+ if (context_raw.viewport_mode == viewport_mode_t.PATH_TRACE) {
let use_live_layer: bool = false;
@@ -196,7 +196,7 @@ class RenderPathBase {
static draw_bloom = (tex: string = "tex") => {
- if (Config.raw.rp_bloom != false) {
+ if (config_raw.rp_bloom != false) {
if (RenderPathBase.bloom_mipmaps == null) {
RenderPathBase.bloom_mipmaps = [];
@@ -239,12 +239,12 @@ class RenderPathBase {
static draw_split = (drawCommands: ()=>void) => {
- Context.raw.view_index = Context.raw.view_index == 0 ? 1 : 0;
+ context_raw.view_index = context_raw.view_index == 0 ? 1 : 0;
@@ -252,17 +252,17 @@ class RenderPathBase {
- Context.raw.viewport_mode == viewport_mode_t.PATH_TRACE ? RenderPathRaytrace.draw(use_live_layer) : drawCommands();
+ context_raw.viewport_mode == viewport_mode_t.PATH_TRACE ? RenderPathRaytrace.draw(use_live_layer) : drawCommands();
drawCommands();
@@ -270,15 +270,15 @@ class RenderPathBase {
static draw_voxels = () => {
- if (Config.raw.rp_gi != false) {
- let voxelize: bool = Context.raw.ddirty > 0 && RenderPathBase.taa_frame > 0;
+ if (config_raw.rp_gi != false) {
+ let voxelize: bool = context_raw.ddirty > 0 && RenderPathBase.taa_frame > 0;
if (voxelize) {
render_path_set_viewport(RenderPathBase.voxels_res, RenderPathBase.voxels_res);
if (MakeMaterial.height_used) {
- let tid: i32 = 0; // Project.layers[0].id;
+ let tid: i32 = 0; // layers[0].id;
render_path_draw_meshes("voxel");
@@ -313,8 +313,8 @@ class RenderPathBase {
static draw_ssao = () => {
- let ssao: bool = Config.raw.rp_ssao != false && Context.raw.camera_type == camera_type_t.PERSPECTIVE;
- if (ssao && Context.raw.ddirty > 0 && RenderPathBase.taa_frame > 0) {
+ let ssao: bool = config_raw.rp_ssao != false && context_raw.camera_type == camera_type_t.PERSPECTIVE;
+ if (ssao && context_raw.ddirty > 0 && RenderPathBase.taa_frame > 0) {
if (render_path_render_targets.get("singlea") == null) {
RenderPathBase.init_ssao();
@@ -341,7 +341,7 @@ class RenderPathBase {
render_path_bind_target("gbuffer1", "gbuffer1");
if (ssao && RenderPathBase.taa_frame > 0) {
render_path_bind_target("singlea", "ssaotex");
@@ -351,7 +351,7 @@ class RenderPathBase {
let voxelao_pass: bool = false;
voxelao_pass = true;
@@ -374,7 +374,7 @@ class RenderPathBase {
static draw_ssr = () => {
- if (Config.raw.rp_ssr != false) {
+ if (config_raw.rp_ssr != false) {
if (_render_path_cached_shader_contexts.get("shader_datas/ssr_pass/ssr_pass") == null) {
@@ -411,7 +411,7 @@ class RenderPathBase {
// static draw_motion_blur = () => {
- // if (Config.raw.rp_motionblur != false) {
+ // if (config_raw.rp_motionblur != false) {
// render_path_set_target("buf");
// render_path_bind_target("tex", "tex");
// render_path_bind_target("gbuffer0", "gbuffer0");
@@ -469,7 +469,7 @@ class RenderPathBase {
render_path_bind_target("gbuffer2", "sveloc");
render_path_draw_shader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
- let skip_taa: bool = Context.raw.split_view;
+ let skip_taa: bool = context_raw.split_view;
if (skip_taa) {
render_path_set_target("taa");
render_path_bind_target(current, "tex");
@@ -532,9 +532,9 @@ class RenderPathBase {
- let hide: bool = Operator.shortcut(Config.keymap.stencil_hide, ShortcutType.ShortcutDown) || keyboard_down("control");
+ let hide: bool = operator_shortcut(config_keymap.stencil_hide, shortcut_type_t.DOWN) || keyboard_down("control");
let is_decal: bool = base_is_decal_layer();
- if (is_decal && !hide) LineDraw.render(Context.raw.layer.decal_mat);
+ if (is_decal && !hide) line_draw_render(context_raw.layer.decal_mat);
static make_gbuffer_copy_textures = () => {
@@ -135,7 +135,7 @@ class RenderPathDeferred {
- if (Config.raw.rp_ssao) {
+ if (config_raw.rp_ssao) {
@@ -36,18 +36,18 @@ class RenderPathRaytrace {
if (!RenderPathRaytrace.ready || RenderPathRaytrace.is_bake) {
RenderPathRaytrace.ready = true;
RenderPathRaytrace.is_bake = false;
- let mode: string = Context.raw.pathtrace_mode == path_trace_mode_t.CORE ? "core" : "full";
+ let mode: string = context_raw.pathtrace_mode == path_trace_mode_t.CORE ? "core" : "full";
RenderPathRaytrace.raytrace_init("raytrace_brute_" + mode + RenderPathRaytrace.ext);
RenderPathRaytrace.last_envmap = null;
- Context.load_envmap();
- Context.update_envmap();
+ if (!context_raw.envmap_loaded) {
+ context_load_envmap();
+ context_update_envmap();
let probe: world_data_t = scene_world;
- let saved_envmap: image_t = Context.raw.show_envmap_blur ? probe._.radiance_mipmaps[0] : Context.raw.saved_envmap;
+ let saved_envmap: image_t = context_raw.show_envmap_blur ? probe._.radiance_mipmaps[0] : context_raw.saved_envmap;
if (RenderPathRaytrace.last_envmap != saved_envmap) {
RenderPathRaytrace.last_envmap = saved_envmap;
@@ -73,7 +73,7 @@ class RenderPathRaytrace {
- if (Context.raw.pdirty > 0 || RenderPathRaytrace.dirty > 0) {
+ if (context_raw.pdirty > 0 || RenderPathRaytrace.dirty > 0) {
base_flatten(true);
@@ -110,8 +110,8 @@ class RenderPathRaytrace {
RenderPathRaytrace.f32a[18] = RenderPathRaytrace.help_mat.m[14];
RenderPathRaytrace.f32a[19] = RenderPathRaytrace.help_mat.m[15];
RenderPathRaytrace.f32a[20] = scene_world.strength * 1.5;
- if (!Context.raw.show_envmap) RenderPathRaytrace.f32a[20] = -RenderPathRaytrace.f32a[20];
- RenderPathRaytrace.f32a[21] = Context.raw.envmap_angle;
+ if (!context_raw.show_envmap) RenderPathRaytrace.f32a[20] = -RenderPathRaytrace.f32a[20];
+ RenderPathRaytrace.f32a[21] = context_raw.envmap_angle;
RenderPathRaytrace.f32a[22] = RenderPathRaytrace.uv_scale;
RenderPathRaytrace.f32a[22] *= scene_meshes[0].data.scale_tex;
@@ -120,18 +120,18 @@ class RenderPathRaytrace {
let framebuffer: image_t = render_path_render_targets.get("buf")._image;
krom_raytrace_dispatch_rays(framebuffer.render_target_, RenderPathRaytrace.f32a.buffer);
- if (Context.raw.ddirty == 1 || Context.raw.pdirty == 1) {
+ if (context_raw.ddirty == 1 || context_raw.pdirty == 1) {
- Context.raw.rdirty = 128;
+ context_raw.rdirty = 128;
- Context.raw.rdirty = 4;
+ context_raw.rdirty = 4;
- // Context.raw.ddirty = 1; // _RENDER
+ // raw.ddirty = 1; // _RENDER
static raytrace_init = (shaderName: string, build: bool = true) => {
@@ -148,9 +148,9 @@ class RenderPathRaytrace {
static build_data = () => {
- let mo: mesh_object_t = !Context.layer_filter_used() ? Context.raw.merged_object : Context.raw.paint_object;
+ let mo: mesh_object_t = !context_layer_filter_used() ? context_raw.merged_object : context_raw.paint_object;
let mo: mesh_object_t = scene_meshes[0];
@@ -163,18 +163,18 @@ class RenderPathRaytrace {
static draw = (useLiveLayer: bool) => {
- if (Context.raw.ddirty > 1 || Context.raw.pdirty > 0 || is_live) RenderPathRaytrace.frame = 0;
+ if (context_raw.ddirty > 1 || context_raw.pdirty > 0 || is_live) RenderPathRaytrace.frame = 0;
// Delay path tracing additional samples while painting
- if (Context.in_viewport() && down) RenderPathRaytrace.frame = 0;
+ if (context_in_viewport() && down) RenderPathRaytrace.frame = 0;
RenderPathRaytrace.commands(useLiveLayer);
RenderPathBase.draw_bloom("buf");
render_path_set_target("buf");
@@ -187,7 +187,7 @@ class RenderPathRaytrace {
@@ -13,9 +13,9 @@ class RenderPathRaytraceBake {
static commands = (parsePaintMaterial: (b?: bool)=>void): bool => {
- if (!RenderPathRaytrace.ready || !RenderPathRaytrace.is_bake || RenderPathRaytraceBake.last_bake != Context.raw.bake_type) {
- let rebuild: bool = !(RenderPathRaytrace.ready && RenderPathRaytrace.is_bake && RenderPathRaytraceBake.last_bake != Context.raw.bake_type);
- RenderPathRaytraceBake.last_bake = Context.raw.bake_type;
+ if (!RenderPathRaytrace.ready || !RenderPathRaytrace.is_bake || RenderPathRaytraceBake.last_bake != context_raw.bake_type) {
+ let rebuild: bool = !(RenderPathRaytrace.ready && RenderPathRaytrace.is_bake && RenderPathRaytraceBake.last_bake != context_raw.bake_type);
+ RenderPathRaytraceBake.last_bake = context_raw.bake_type;
RenderPathRaytrace.is_bake = true;
@@ -30,36 +30,36 @@ class RenderPathRaytraceBake {
t.name = "baketex0";
t.format = "RGBA64";
t.name = "baketex1";
t.name = "baketex2";
t.format = "RGBA64"; // Match raytrace_target format
- Context.raw.bake_type = bake_type_t.INIT;
+ context_raw.bake_type = bake_type_t.INIT;
parsePaintMaterial();
render_path_set_target("baketex0");
render_path_clear_target(0x00000000); // Pixels with alpha of 0.0 are skipped during raytracing
render_path_set_target("baketex0", ["baketex1"]);
@@ -70,44 +70,44 @@ class RenderPathRaytraceBake {
- if (RenderPathRaytrace.last_envmap != saved_envmap || RenderPathRaytraceBake.last_layer != Context.raw.layer.texpaint) {
+ if (RenderPathRaytrace.last_envmap != saved_envmap || RenderPathRaytraceBake.last_layer != context_raw.layer.texpaint) {
- RenderPathRaytraceBake.last_layer = Context.raw.layer.texpaint;
+ RenderPathRaytraceBake.last_layer = context_raw.layer.texpaint;
let baketex0: image_t = render_path_render_targets.get("baketex0")._image;
let baketex1: image_t = render_path_render_targets.get("baketex1")._image;
let bnoise_sobol: image_t = scene_embedded.get("bnoise_sobol.k");
let bnoise_scramble: image_t = scene_embedded.get("bnoise_scramble.k");
let bnoise_rank: image_t = scene_embedded.get("bnoise_rank.k");
- let texpaint_undo: image_t = render_path_render_targets.get("texpaint_undo" + History.undo_i)._image;
+ let texpaint_undo: image_t = render_path_render_targets.get("texpaint_undo" + history_undo_i)._image;
krom_raytrace_set_textures(baketex0, baketex1, texpaint_undo, saved_envmap.texture_, bnoise_sobol.texture_, bnoise_scramble.texture_, bnoise_rank.texture_);
- if (Context.raw.brush_time > 0) {
+ if (context_raw.brush_time > 0) {
let f32a: Float32Array = RenderPathRaytrace.f32a;
f32a[0] = RenderPathRaytrace.frame++;
- f32a[1] = Context.raw.bake_ao_strength;
- f32a[2] = Context.raw.bake_ao_radius;
- f32a[3] = Context.raw.bake_ao_offset;
+ f32a[1] = context_raw.bake_ao_strength;
+ f32a[2] = context_raw.bake_ao_radius;
+ f32a[3] = context_raw.bake_ao_offset;
f32a[4] = scene_world.strength;
- f32a[5] = Context.raw.bake_up_axis;
- f32a[6] = Context.raw.envmap_angle;
+ f32a[5] = context_raw.bake_up_axis;
+ f32a[6] = context_raw.envmap_angle;
let framebuffer: image_t = render_path_render_targets.get("baketex2")._image;
krom_raytrace_dispatch_rays(framebuffer.render_target_, f32a.buffer);
- render_path_set_target("texpaint" + Context.raw.layer.id);
+ render_path_set_target("texpaint" + context_raw.layer.id);
render_path_bind_target("baketex2", "tex");
@@ -139,9 +139,9 @@ class RenderPathRaytraceBake {
static get_bake_shader_name = (): string => {
- return Context.raw.bake_type == bake_type_t.AO ? "raytrace_bake_ao" + RenderPathRaytrace.ext :
- Context.raw.bake_type == bake_type_t.LIGHTMAP ? "raytrace_bake_light" + RenderPathRaytrace.ext :
- Context.raw.bake_type == bake_type_t.BENT_NORMAL ? "raytrace_bake_bent" + RenderPathRaytrace.ext :
+ return context_raw.bake_type == bake_type_t.AO ? "raytrace_bake_ao" + RenderPathRaytrace.ext :
+ context_raw.bake_type == bake_type_t.LIGHTMAP ? "raytrace_bake_light" + RenderPathRaytrace.ext :
+ context_raw.bake_type == bake_type_t.BENT_NORMAL ? "raytrace_bake_bent" + RenderPathRaytrace.ext :
"raytrace_bake_thick" + RenderPathRaytrace.ext;
@@ -1,57 +0,0 @@
-class Res {
- static bundled: Map<string, image_t> = new Map();
- static load = (names: string[], done: ()=>void) => {
- let loaded: i32 = 0;
- for (let s of names) {
- let image: image_t = data_get_image(s);
- Res.bundled.set(s, image);
- loaded++;
- if (loaded == names.length) done();
- static get = (name: string): image_t => {
- return Res.bundled.get(name);
- static tile50 = (img: image_t, x: i32, y: i32): rect_t => {
- let size: i32 = Config.raw.window_scale > 1 ? 100 : 50;
- return { x: x * size, y: y * size, w: size, h: size };
- static tile25 = (img: image_t, x: i32, y: i32): rect_t => {
- let size: i32 = Config.raw.window_scale > 1 ? 50 : 25;
- static tile18 = (img: image_t, x: i32, y: i32): rect_t => {
- let size: i32 = Config.raw.window_scale > 1 ? 36 : 18;
- return { x: x * size, y: img.height - (y + 1) * size, w: size, h: size };
- ///if arm_snapshot
- static embed_raw = (handle: string, name: string, file: ArrayBuffer) => {
- data_cached_blobs.set(name, file);
- data_get_scene_raw(handle, (_) => {});
- data_cached_blobs.delete(name);
- static embed_blob = (name: string, file: ArrayBuffer) => {
- static embed_font = (name: string, file: ArrayBuffer) => {
- data_cached_fonts.set(name, g2_font_create(file));
-type rect_t = {
- x?: i32;
- y?: i32;
- w?: i32;
- h?: i32;
@@ -1,23 +0,0 @@
-class Strings {
- static error0 = (): string => { return tr("Error: .arm file expected"); }
- static error1 = (): string => { return tr("Error: Unknown asset format"); }
- static error2 = (): string => { return tr("Error: Could not locate texture"); }
- static error3 = (): string => { return tr("Error: Failed to read mesh data"); }
- static error5 = (): string => { return tr("Error: Check internet connection to access the cloud"); }
- static info0 = (): string => { return tr("Info: Asset already imported"); }
- static get graphics_api(): string {
- return "Direct3D11";
- ///elseif krom_direct3d12
- return "Direct3D12";
- ///elseif krom_metal
- return "Metal";
- ///elseif krom_vulkan
- return "Vulkan";
- return "OpenGL";
@@ -14,17 +14,17 @@ class TabBrowser {
- let statush: i32 = Config.raw.layout[layout_size_t.STATUS_H];
+ let statush: i32 = config_raw.layout[layout_size_t.STATUS_H];
if (zui_tab(htab, tr("Browser")) && statush > UIStatus.default_status_h * zui_SCALE(ui)) {
- if (Config.raw.bookmarks == null) {
- Config.raw.bookmarks = [];
+ if (config_raw.bookmarks == null) {
+ config_raw.bookmarks = [];
let bookmarks_w: i32 = Math.floor(100 * zui_SCALE(ui));
- if (TabBrowser.hpath.text == "" && Config.raw.bookmarks.length > 0) { // Init to first bookmark
- TabBrowser.hpath.text = Config.raw.bookmarks[0];
+ if (TabBrowser.hpath.text == "" && config_raw.bookmarks.length > 0) { // Init to first bookmark
+ TabBrowser.hpath.text = config_raw.bookmarks[0];
@@ -37,8 +37,8 @@ class TabBrowser {
if (zui_button("+")) {
- Config.raw.bookmarks.push(TabBrowser.hpath.text);
+ config_raw.bookmarks.push(TabBrowser.hpath.text);
if (ui.is_hovered) zui_tooltip(tr("Add bookmark"));
@@ -84,25 +84,25 @@ class TabBrowser {
ui._x = bookmarks_w;
ui._w -= bookmarks_w;
UIFiles.file_browser(ui, TabBrowser.hpath, false, true, TabBrowser.hsearch.text, refresh, (file: string) => {
- let file_name: string = file.substr(file.lastIndexOf(Path.sep) + 1);
+ let file_name: string = file.substr(file.lastIndexOf(path_sep) + 1);
if (file_name != "..") {
if (UIMenu.menu_button(ui, tr("Import"))) {
ImportAsset.run(file);
- if (Path.is_texture(file)) {
+ if (path_is_texture(file)) {
if (UIMenu.menu_button(ui, tr("Set as Envmap"))) {
ImportAsset.run(file, -1.0, -1.0, true, true, () => {
let asset_index: i32 = -1;
- if (Project.assets[i].file == file) {
+ if (project_assets[i].file == file) {
if (asset_index != -1) {
- ImportEnvmap.run(file, Project.get_image(Project.assets[asset_index]));
+ ImportEnvmap.run(file, project_get_image(project_assets[asset_index]));
@@ -113,14 +113,14 @@ class TabBrowser {
- base_create_image_mask(Project.assets[asset_index]);
+ base_create_image_mask(project_assets[asset_index]);
@@ -132,19 +132,19 @@ class TabBrowser {
- Context.raw.colorid_handle.position = asset_index;
- Context.raw.colorid_picked = false;
+ context_raw.colorid_handle.position = asset_index;
+ context_raw.colorid_picked = false;
@@ -153,9 +153,9 @@ class TabBrowser {
if (UIMenu.menu_button(ui, tr("Open Externally"))) {
- File.start(file);
+ file_start(file);
- }, Path.is_texture(file) ? 5 : 2);
+ }, path_is_texture(file) ? 5 : 2);
@@ -164,9 +164,9 @@ class TabBrowser {
ImportAsset.run(path);
- TabBrowser.hpath.text = TabBrowser.hpath.text.substr(0, TabBrowser.hpath.text.lastIndexOf(Path.sep));
+ TabBrowser.hpath.text = TabBrowser.hpath.text.substr(0, TabBrowser.hpath.text.lastIndexOf(path_sep));
- TabBrowser.known = TabBrowser.hpath.text.substr(TabBrowser.hpath.text.lastIndexOf(Path.sep)).indexOf(".") > 0;
+ TabBrowser.known = TabBrowser.hpath.text.substr(TabBrowser.hpath.text.lastIndexOf(path_sep)).indexOf(".") > 0;
///if krom_android
if (TabBrowser.hpath.text.endsWith("." + manifest_title.toLowerCase())) TabBrowser.known = false;
@@ -201,8 +201,8 @@ class TabBrowser {
- for (let b of Config.raw.bookmarks) {
- let folder: string = b.substr(b.lastIndexOf(Path.sep) + 1);
+ for (let b of config_raw.bookmarks) {
+ let folder: string = b.substr(b.lastIndexOf(path_sep) + 1);
if (zui_button(folder, zui_align_t.LEFT)) {
TabBrowser.hpath.text = b;
@@ -211,8 +211,8 @@ class TabBrowser {
- array_remove(Config.raw.bookmarks, b);
+ array_remove(config_raw.bookmarks, b);
@@ -9,13 +9,13 @@ class TabBrushes {
zui_row([1 / 4, 1 / 4, 1 / 4]);
+ context_raw.brush = SlotBrush.create();
if (zui_button(tr("Import"))) {
- Project.import_brush();
+ project_import_brush();
if (zui_button(tr("Nodes"))) {
UIBase.show_brush_nodes();
@@ -24,34 +24,34 @@ class TabBrushes {
zui_separator(3, false);
let slotw: i32 = Math.floor(51 * zui_SCALE(ui));
- let num: i32 = Math.floor(Config.raw.layout[layout_size_t.SIDEBAR_W] / slotw);
+ let num: i32 = Math.floor(config_raw.layout[layout_size_t.SIDEBAR_W] / slotw);
- for (let row: i32 = 0; row < Math.floor(Math.ceil(Project.brushes.length / num)); ++row) {
- let mult: i32 = Config.raw.show_asset_names ? 2 : 1;
+ for (let row: i32 = 0; row < Math.floor(Math.ceil(project_brushes.length / num)); ++row) {
+ let mult: i32 = config_raw.show_asset_names ? 2 : 1;
let ar: f32[] = [];
for (let i: i32 = 0; i < num * mult; ++i) ar.push(1 / num);
zui_row(ar);
- let off: f32 = Config.raw.show_asset_names ? zui_ELEMENT_OFFSET(ui) * 10.0 : 6;
+ let off: f32 = config_raw.show_asset_names ? zui_ELEMENT_OFFSET(ui) * 10.0 : 6;
if (row > 0) ui._y += off;
for (let j: i32 = 0; j < num; ++j) {
let imgw: i32 = Math.floor(50 * zui_SCALE(ui));
let i: i32 = j + row * num;
- if (i >= Project.brushes.length) {
+ if (i >= project_brushes.length) {
zui_end_element(imgw);
- if (Config.raw.show_asset_names) zui_end_element(0);
+ if (config_raw.show_asset_names) zui_end_element(0);
- let img: image_t = zui_SCALE(ui) > 1 ? Project.brushes[i].image : Project.brushes[i].image_icon;
- let img_full: image_t = Project.brushes[i].image;
+ let img: image_t = zui_SCALE(ui) > 1 ? project_brushes[i].image : project_brushes[i].image_icon;
+ let img_full: image_t = project_brushes[i].image;
- if (Context.raw.brush == Project.brushes[i]) {
+ if (context_raw.brush == project_brushes[i]) {
// Zui.fill(1, -2, img.width + 3, img.height + 3, ui.t.HIGHLIGHT_COL); // TODO
let off: i32 = row % 2 == 1 ? 1 : 0;
let w: i32 = 50;
- if (Config.raw.window_scale > 1) w += Math.floor(Config.raw.window_scale * 2);
+ if (config_raw.window_scale > 1) w += Math.floor(config_raw.window_scale * 2);
zui_fill(-1, -2, w + 3, 2, ui.t.HIGHLIGHT_COL);
zui_fill(-1, w - off, w + 3, 2 + off, ui.t.HIGHLIGHT_COL);
zui_fill(-1, -2, 2, w + 3, ui.t.HIGHLIGHT_COL);
@@ -61,40 +61,40 @@ class TabBrushes {
let uix: f32 = ui._x;
//let uiy: f32 = ui._y;
let tile: i32 = zui_SCALE(ui) > 1 ? 100 : 50;
- let state: zui_state_t = Project.brushes[i].preview_ready ? zui_image(img) : zui_image(Res.get("icons.k"), -1, -1.0, tile * 5, tile, tile, tile);
+ let state: zui_state_t = project_brushes[i].preview_ready ? zui_image(img) : zui_image(resource_get("icons.k"), -1, -1.0, tile * 5, tile, tile, tile);
- if (Context.raw.brush != Project.brushes[i]) Context.select_brush(i);
- if (time_time() - Context.raw.select_time < 0.25) UIBase.show_brush_nodes();
+ if (context_raw.brush != project_brushes[i]) context_select_brush(i);
+ if (time_time() - context_raw.select_time < 0.25) UIBase.show_brush_nodes();
// app_drag_off_x = -(mouse_x - uix - ui._windowX - 3);
// app_drag_off_y = -(mouse_y - uiy - ui._windowY + 1);
- // app_drag_brush = Context.raw.brush;
+ // app_drag_brush = raw.brush;
- Context.select_brush(i);
- let add: i32 = Project.brushes.length > 1 ? 1 : 0;
+ context_select_brush(i);
+ let add: i32 = project_brushes.length > 1 ? 1 : 0;
- //let b: SlotBrushRaw = Project.brushes[i];
+ //let b: SlotBrushRaw = brushes[i];
BoxExport.show_brush();
- let cloned: any = json_parse(json_stringify(Project.brushes[i].canvas));
- Context.raw.brush.canvas = cloned;
- Context.set_brush(Context.raw.brush);
+ let cloned: any = json_parse(json_stringify(project_brushes[i].canvas));
+ context_raw.brush.canvas = cloned;
+ context_set_brush(context_raw.brush);
- if (Project.brushes.length > 1 && UIMenu.menu_button(ui, tr("Delete"), "delete")) {
- TabBrushes.delete_brush(Project.brushes[i]);
+ if (project_brushes.length > 1 && UIMenu.menu_button(ui, tr("Delete"), "delete")) {
+ TabBrushes.delete_brush(project_brushes[i]);
}, 2 + add);
@@ -102,26 +102,26 @@ class TabBrushes {
if (ui.is_hovered) {
if (img_full == null) {
- let _brush: SlotBrushRaw = Context.raw.brush;
- Context.raw.brush = Project.brushes[i];
+ let _brush: SlotBrushRaw = context_raw.brush;
+ context_raw.brush = project_brushes[i];
- Context.raw.brush = _brush;
+ context_raw.brush = _brush;
zui_tooltip_image(img_full);
- zui_tooltip(Project.brushes[i].canvas.name);
+ zui_tooltip(project_brushes[i].canvas.name);
- if (Config.raw.show_asset_names) {
+ if (config_raw.show_asset_names) {
ui._x = uix;
ui._y += slotw * 0.9;
- zui_text(Project.brushes[i].canvas.name, zui_align_t.CENTER);
- if (ui.is_hovered) zui_tooltip(Project.brushes[i].canvas.name);
+ zui_text(project_brushes[i].canvas.name, zui_align_t.CENTER);
+ if (ui.is_hovered) zui_tooltip(project_brushes[i].canvas.name);
ui._y -= slotw * 0.9;
- if (i == Project.brushes.length - 1) {
+ if (i == project_brushes.length - 1) {
ui._y += j == num - 1 ? imgw : imgw + zui_ELEMENT_H(ui) + zui_ELEMENT_OFFSET(ui);
@@ -132,17 +132,17 @@ class TabBrushes {
- if (in_focus && ui.is_delete_down && Project.brushes.length > 1) {
+ if (in_focus && ui.is_delete_down && project_brushes.length > 1) {
- TabBrushes.delete_brush(Context.raw.brush);
+ TabBrushes.delete_brush(context_raw.brush);
static delete_brush = (b: SlotBrushRaw) => {
- let i: i32 = Project.brushes.indexOf(b);
- Context.select_brush(i == Project.brushes.length - 1 ? i - 1 : i + 1);
- Project.brushes.splice(i, 1);
+ let i: i32 = project_brushes.indexOf(b);
+ context_select_brush(i == project_brushes.length - 1 ? i - 1 : i + 1);
+ project_brushes.splice(i, 1);
@@ -4,22 +4,22 @@ class TabConsole {
- let title: string = Console.message_timer > 0 ? Console.message + " " : tr("Console");
- let color: i32 = Console.message_timer > 0 ? Console.message_color : -1;
+ let title: string = console_message_timer > 0 ? console_message + " " : tr("Console");
+ let color: i32 = console_message_timer > 0 ? console_message_color : -1;
if (zui_tab(htab, title, false, color) && statush > UIStatus.default_status_h * zui_SCALE(ui)) {
///if (krom_windows || krom_linux || krom_darwin) // Copy
zui_row([1 / 14, 1 / 14, 1 / 14]);
zui_row([1 / 4, 1 / 4]);
@@ -28,21 +28,21 @@ class TabConsole {
if (zui_button(tr("Clear"))) {
- Console.last_traces = [];
+ console_last_traces = [];
- let str: string = Console.last_traces.join("\n");
+ let str: string = console_last_traces.join("\n");
UIFiles.show("txt", true, false, (path: string) => {
- path = path + Path.sep + f;
+ path = path + path_sep + f;
if (!path.endsWith(".txt")) path += ".txt";
krom_file_save_bytes(path, sys_string_to_buffer(str));
///if (krom_windows || krom_linux || krom_darwin)
if (zui_button(tr("Copy"))) {
krom_copy_to_clipboard(str);
@@ -54,7 +54,7 @@ class TabConsole {
let f: g2_font_t = data_get_font("font_mono.ttf");
zui_set_font(ui, f);
ui.font_size = Math.floor(15 * zui_SCALE(ui));
- for (let t of Console.last_traces) {
+ for (let t of console_last_traces) {
zui_text(t);
zui_set_font(ui, _font);
@@ -5,18 +5,18 @@ class TabFonts {
if (zui_tab(htab, tr("Fonts")) && statush > UIStatus.default_status_h * zui_SCALE(ui)) {
zui_row([1 / 14, 1 / 14]);
- if (zui_button(tr("Import"))) Project.import_asset("ttf,ttc,otf");
+ if (zui_button(tr("Import"))) project_import_asset("ttf,ttc,otf");
if (ui.is_hovered) zui_tooltip(tr("Import font file"));
@@ -25,35 +25,35 @@ class TabFonts {
- let statusw: i32 = sys_width() - UIToolbar.toolbar_w - Config.raw.layout[layout_size_t.SIDEBAR_W];
+ let statusw: i32 = sys_width() - UIToolbar.toolbar_w - config_raw.layout[layout_size_t.SIDEBAR_W];
let num: i32 = Math.floor(statusw / slotw);
- for (let row: i32 = 0; row < Math.floor(Math.ceil(Project.fonts.length / num)); ++row) {
+ for (let row: i32 = 0; row < Math.floor(Math.ceil(project_fonts.length / num)); ++row) {
- if (i >= Project.fonts.length) {
+ if (i >= project_fonts.length) {
- let img: image_t = Project.fonts[i].image;
+ let img: image_t = project_fonts[i].image;
- if (Context.raw.font == Project.fonts[i]) {
+ if (context_raw.font == project_fonts[i]) {
@@ -63,7 +63,7 @@ class TabFonts {
let state: zui_state_t = zui_state_t.IDLE;
- if (Project.fonts[i].preview_ready) {
+ if (project_fonts[i].preview_ready) {
// g2_set_pipeline(UIView2D.pipe); // L8
// ///if krom_opengl
// g4_set_pipeline(UIView2D.pipe);
@@ -73,50 +73,50 @@ class TabFonts {
// g2_set_pipeline(null);
- state = zui_image(Res.get("icons.k"), -1, -1.0, tile * 6, tile, tile, tile);
+ state = zui_image(resource_get("icons.k"), -1, -1.0, tile * 6, tile, tile, tile);
- if (Context.raw.font != Project.fonts[i]) {
+ if (context_raw.font != project_fonts[i]) {
- Context.select_font(i);
+ context_select_font(i);
- if (time_time() - Context.raw.select_time < 0.25) UIBase.show_2d_view(view_2d_type_t.FONT);
+ if (time_time() - context_raw.select_time < 0.25) UIBase.show_2d_view(view_2d_type_t.FONT);
- let add: i32 = Project.fonts.length > 1 ? 1 : 0;
+ let add: i32 = project_fonts.length > 1 ? 1 : 0;
- if (Project.fonts.length > 1 && UIMenu.menu_button(ui, tr("Delete"), "delete") && Project.fonts[i].file != "") {
- TabFonts.delete_font(Project.fonts[i]);
+ if (project_fonts.length > 1 && UIMenu.menu_button(ui, tr("Delete"), "delete") && project_fonts[i].file != "") {
+ TabFonts.delete_font(project_fonts[i]);
}, 0 + add);
if (img == null) {
- let _font: SlotFontRaw = Context.raw.font;
- Context.raw.font = Project.fonts[i];
+ let _font: SlotFontRaw = context_raw.font;
+ context_raw.font = project_fonts[i];
- Context.raw.font = _font;
+ context_raw.font = _font;
zui_tooltip_image(img);
- zui_tooltip(Project.fonts[i].name);
+ zui_tooltip(project_fonts[i].name);
- zui_text(Project.fonts[i].name, zui_align_t.CENTER);
- if (ui.is_hovered) zui_tooltip(Project.fonts[i].name);
+ zui_text(project_fonts[i].name, zui_align_t.CENTER);
+ if (ui.is_hovered) zui_tooltip(project_fonts[i].name);
- if (i == Project.fonts.length - 1) {
+ if (i == project_fonts.length - 1) {
@@ -127,19 +127,19 @@ class TabFonts {
- if (in_focus && ui.is_delete_down && Project.fonts.length > 1 && Context.raw.font.file != "") {
+ if (in_focus && ui.is_delete_down && project_fonts.length > 1 && context_raw.font.file != "") {
- TabFonts.delete_font(Context.raw.font);
+ TabFonts.delete_font(context_raw.font);
static delete_font = (font: SlotFontRaw) => {
- let i: i32 = Project.fonts.indexOf(font);
+ let i: i32 = project_fonts.indexOf(font);
- Context.select_font(i == Project.fonts.length - 1 ? i - 1 : i + 1);
- data_delete_font(Project.fonts[i].file);
- Project.fonts.splice(i, 1);
+ context_select_font(i == project_fonts.length - 1 ? i - 1 : i + 1);
+ data_delete_font(project_fonts[i].file);
+ project_fonts.splice(i, 1);
UIBase.hwnds[2].redraws = 2;
@@ -6,21 +6,21 @@ class TabHistory {
if (zui_tab(htab, tr("History"))) {
- for (let i: i32 = 0; i < History.steps.length; ++i) {
+ for (let i: i32 = 0; i < history_steps.length; ++i) {
+ let active: i32 = history_steps.length - 1 - history_redos;
if (i == active) {
zui_fill(0, 0, ui._window_w, ui.t.ELEMENT_H, ui.t.HIGHLIGHT_COL);
- zui_text(History.steps[i].name);
+ zui_text(history_steps[i].name);
if (ui.is_released) { // Jump to undo step
let diff: i32 = i - active;
while (diff > 0) {
diff--;
- History.redo();
+ history_redo();
while (diff < 0) {
diff++;
+ history_undo();
zui_fill(0, 0, (ui._window_w / zui_SCALE(ui) - 2), 1 * zui_SCALE(ui), ui.t.SEPARATOR_COL);
@@ -4,7 +4,7 @@
class TabMaterials {
mini ? TabMaterials.draw_mini(htab) : TabMaterials.draw_full(htab);
@@ -29,7 +29,7 @@ class TabMaterials {
TabMaterials.button_new(tr("New"));
- Project.import_material();
+ project_import_material();
TabMaterials.button_nodes();
@@ -44,37 +44,37 @@ class TabMaterials {
UIBase.show_material_nodes();
- else if (ui.is_hovered) zui_tooltip(tr("Show Node Editor") + ` (${Config.keymap.toggle_node_editor})`);
+ else if (ui.is_hovered) zui_tooltip(tr("Show Node Editor") + ` (${config_keymap.toggle_node_editor})`);
- for (let row: i32 = 0; row < Math.floor(Math.ceil(Project.materials.length / num)); ++row) {
+ for (let row: i32 = 0; row < Math.floor(Math.ceil(project_materials.length / num)); ++row) {
for (let i = 0; i < num * mult; ++i) ar.push(1 / num);
- if (i >= Project.materials.length) {
+ if (i >= project_materials.length) {
- let img: image_t = zui_SCALE(ui) > 1 ? Project.materials[i].image : Project.materials[i].image_icon;
- let imgFull: image_t = Project.materials[i].image;
+ let img: image_t = zui_SCALE(ui) > 1 ? project_materials[i].image : project_materials[i].image_icon;
+ let imgFull: image_t = project_materials[i].image;
// Highligh selected
- if (Context.raw.material == Project.materials[i]) {
+ if (context_raw.material == project_materials[i]) {
let w: f32 = ui._w / zui_SCALE(ui);
zui_rect(0, -2, w - 2, w - 4, ui.t.HIGHLIGHT_COL, 3);
@@ -82,7 +82,7 @@ class TabMaterials {
@@ -91,7 +91,7 @@ class TabMaterials {
///if krom_opengl
- ui.image_invert_y = Project.materials[i].preview_ready;
+ ui.image_invert_y = project_materials[i].preview_ready;
// Draw material icon
@@ -99,14 +99,14 @@ class TabMaterials {
let uiy: f32 = ui._y;
let imgh: f32 = mini ? UIBase.default_sidebar_mini_w * 0.85 * zui_SCALE(ui) : -1.0;
- let state = Project.materials[i].preview_ready ?
+ let state = project_materials[i].preview_ready ?
zui_image(img, 0xffffffff, imgh) :
- zui_image(Res.get("icons.k"), 0xffffffff, -1.0, tile, tile, tile, tile);
+ zui_image(resource_get("icons.k"), 0xffffffff, -1.0, tile, tile, tile, tile);
// Draw material numbers when selecting a material via keyboard shortcut
- if (i < 9 && Operator.shortcut(Config.keymap.select_material, ShortcutType.ShortcutDown)) {
+ if (i < 9 && operator_shortcut(config_keymap.select_material, shortcut_type_t.DOWN)) {
let number: string = String(i + 1);
@@ -119,10 +119,10 @@ class TabMaterials {
// Select material
if (state == zui_state_t.STARTED && ui.input_y > ui._window_y) {
- if (Context.raw.material != Project.materials[i]) {
- Context.select_material(i);
+ if (context_raw.material != project_materials[i]) {
+ context_select_material(i);
- if (Context.raw.tool == workspace_tool_t.MATERIAL) {
+ if (context_raw.tool == workspace_tool_t.MATERIAL) {
@@ -132,54 +132,54 @@ class TabMaterials {
base_drag_off_x = -(mouse_x - uix - ui._window_x - 3);
base_drag_off_y = -(mouse_y - uiy - ui._window_y + 1);
- base_drag_material = Context.raw.material;
+ base_drag_material = context_raw.material;
// Double click to show nodes
base_drag_material = null;
base_is_dragging = false;
// Context menu
- let add: i32 = Project.materials.length > 1 ? 1 : 0;
+ let add: i32 = project_materials.length > 1 ? 1 : 0;
- let m: SlotMaterialRaw = Project.materials[i];
+ let m: SlotMaterialRaw = project_materials[i];
if (UIMenu.menu_button(ui, tr("To Fill Layer"))) {
base_create_fill_layer();
BoxExport.show_material();
if (UIMenu.menu_button(ui, tr("Bake"))) {
BoxExport.show_bake_material();
- let cloned: zui_node_canvas_t = json_parse(json_stringify(Project.materials[i].canvas));
- Context.raw.material.canvas = cloned;
+ let cloned: zui_node_canvas_t = json_parse(json_stringify(project_materials[i].canvas));
+ context_raw.material.canvas = cloned;
TabMaterials.update_material();
- History.duplicate_material();
+ history_duplicate_material();
- if (Project.materials.length > 1 && UIMenu.menu_button(ui, tr("Delete"), "delete")) {
+ if (project_materials.length > 1 && UIMenu.menu_button(ui, tr("Delete"), "delete")) {
TabMaterials.delete_material(m);
@@ -226,20 +226,20 @@ class TabMaterials {
zui_tooltip_image(imgFull);
- if (i < 9) zui_tooltip(Project.materials[i].canvas.name + " - (" + Config.keymap.select_material + " " + (i + 1) + ")");
- else zui_tooltip(Project.materials[i].canvas.name);
+ if (i < 9) zui_tooltip(project_materials[i].canvas.name + " - (" + config_keymap.select_material + " " + (i + 1) + ")");
+ else zui_tooltip(project_materials[i].canvas.name);
- zui_text(Project.materials[i].canvas.name, zui_align_t.CENTER);
+ zui_text(project_materials[i].canvas.name, zui_align_t.CENTER);
- if (i == Project.materials.length - 1) {
+ if (i == project_materials.length - 1) {
@@ -254,9 +254,9 @@ class TabMaterials {
- if (in_focus && ui.is_delete_down && Project.materials.length > 1) {
+ if (in_focus && ui.is_delete_down && project_materials.length > 1) {
- TabMaterials.delete_material(Context.raw.material);
+ TabMaterials.delete_material(context_raw.material);
@@ -264,11 +264,11 @@ class TabMaterials {
@@ -278,7 +278,7 @@ class TabMaterials {
if (decal) UtilRender.make_decal_preview();
@@ -296,8 +296,8 @@ class TabMaterials {
static accept_swatch_drag = (swatch: swatch_color_t) => {
- for (let node of Context.raw.material.canvas.nodes) {
+ for (let node of context_raw.material.canvas.nodes) {
if (node.type == "RGB" ) {
node.outputs[0].default_value = [
color_get_rb(swatch.base) / 255,
@@ -314,19 +314,19 @@ class TabMaterials {
node.inputs[7].default_value = swatch.height;
static delete_material = (m: SlotMaterialRaw) => {
- let i: i32 = Project.materials.indexOf(m);
- for (let l of Project.layers) if (l.fill_layer == m) l.fill_layer = null;
- History.delete_material();
- Context.select_material(i == Project.materials.length - 1 ? i - 1 : i + 1);
- Project.materials.splice(i, 1);
+ let i: i32 = project_materials.indexOf(m);
+ for (let l of project_layers) if (l.fill_layer == m) l.fill_layer = null;
+ history_delete_material();
+ context_select_material(i == project_materials.length - 1 ? i - 1 : i + 1);
+ project_materials.splice(i, 1);
- for (let m of Project.materials) TabMaterials.update_material_pointers(m.canvas.nodes, i);
+ for (let m of project_materials) TabMaterials.update_material_pointers(m.canvas.nodes, i);
@@ -3,13 +3,13 @@ class TabMeshes {
if (zui_tab(htab, tr("Meshes")) && statush > UIStatus.default_status_h * zui_SCALE(ui)) {
zui_row([1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6]);
@@ -18,7 +18,7 @@ class TabMeshes {
zui_row([1 / 7, 1 / 7, 1 / 7, 1 / 7, 1 / 7, 1 / 7, 1 / 7]);
@@ -28,11 +28,11 @@ class TabMeshes {
- if (UIMenu.menu_button(ui, tr("Replace Existing"), `${Config.keymap.file_import_assets}`)) {
- Project.import_mesh(true);
+ if (UIMenu.menu_button(ui, tr("Replace Existing"), `${config_keymap.file_import_assets}`)) {
+ project_import_mesh(true);
if (UIMenu.menu_button(ui, tr("Append"))) {
- Project.import_mesh(false);
+ project_import_mesh(false);
}, 2);
@@ -51,93 +51,93 @@ class TabMeshes {
if (zui_button(tr("Flip Normals"))) {
UtilMesh.flip_normals();
if (zui_button(tr("Calculate Normals"))) {
- if (UIMenu.menu_button(ui, tr("Smooth"))) { UtilMesh.calc_normals(true); Context.raw.ddirty = 2; }
- if (UIMenu.menu_button(ui, tr("Flat"))) { UtilMesh.calc_normals(false); Context.raw.ddirty = 2; }
+ if (UIMenu.menu_button(ui, tr("Smooth"))) { UtilMesh.calc_normals(true); context_raw.ddirty = 2; }
+ if (UIMenu.menu_button(ui, tr("Flat"))) { UtilMesh.calc_normals(false); context_raw.ddirty = 2; }
if (zui_button(tr("Geometry to Origin"))) {
UtilMesh.to_origin();
if (zui_button(tr("Apply Displacement"))) {
- UtilMesh.apply_displacement(Project.layers[0].texpaint_pack);
+ UtilMesh.apply_displacement(project_layers[0].texpaint_pack);
- let displace_strength: f32 = Config.raw.displace_strength > 0 ? Config.raw.displace_strength : 1.0;
- let uv_scale: f32 = scene_meshes[0].data.scale_tex * Context.raw.brush_scale;
+ let displace_strength: f32 = config_raw.displace_strength > 0 ? config_raw.displace_strength : 1.0;
+ let uv_scale: f32 = scene_meshes[0].data.scale_tex * context_raw.brush_scale;
UtilMesh.apply_displacement(BrushOutputNode.inst.texpaint_pack, 0.05 * displace_strength, uv_scale);
UtilMesh.calc_normals();
if (zui_button(tr("Rotate"))) {
if (UIMenu.menu_button(ui, tr("Rotate X"))) {
UtilMesh.swap_axis(1, 2);
if (UIMenu.menu_button(ui, tr("Rotate Y"))) {
UtilMesh.swap_axis(2, 0);
if (UIMenu.menu_button(ui, tr("Rotate Z"))) {
UtilMesh.swap_axis(0, 1);
}, 3);
- let o: mesh_object_t = Project.paint_objects[i];
+ let o: mesh_object_t = project_paint_objects[i];
let h: zui_handle_t = zui_handle("tabmeshes_0");
h.selected = o.base.visible;
o.base.visible = zui_check(h, o.base.name);
- Context.raw.export_mesh_index = i + 1;
+ context_raw.export_mesh_index = i + 1;
BoxExport.show_mesh();
- if (Project.paint_objects.length > 1 && UIMenu.menu_button(ui, tr("Delete"))) {
- array_remove(Project.paint_objects, o);
+ if (project_paint_objects.length > 1 && UIMenu.menu_button(ui, tr("Delete"))) {
+ array_remove(project_paint_objects, o);
while (o.base.children.length > 0) {
let child: object_t = o.base.children[0];
object_set_parent(child, null);
- if (Project.paint_objects[0].base != child) {
- object_set_parent(child, Project.paint_objects[0].base);
+ if (project_paint_objects[0].base != child) {
+ object_set_parent(child, project_paint_objects[0].base);
if (o.base.children.length == 0) {
- vec4_set_from(Project.paint_objects[0].base.transform.scale, o.base.transform.scale);
- transform_build_matrix(Project.paint_objects[0].base.transform);
+ vec4_set_from(project_paint_objects[0].base.transform.scale, o.base.transform.scale);
+ transform_build_matrix(project_paint_objects[0].base.transform);
data_delete_mesh(o.data._.handle);
mesh_object_remove(o);
- }, Project.paint_objects.length > 1 ? 2 : 1);
+ }, project_paint_objects.length > 1 ? 2 : 1);
if (h.changed) {
@@ -147,8 +147,8 @@ class TabMeshes {
static set_default_mesh = (name: string) => {
let mo: mesh_object_t = null;
if (name == ".Plane" || name == ".Sphere") {
- let res: i32 = Config.raw.rp_supersample > 1.0 ? 2048 : 1024;
- let mesh: any = name == ".Plane" ? Geom.make_plane(1, 1, res, res) : Geom.make_uv_sphere(1.0, res, Math.floor(res / 2), false, 2.0);
+ let res: i32 = config_raw.rp_supersample > 1.0 ? 2048 : 1024;
+ let mesh: any = name == ".Plane" ? geom_make_plane(1, 1, res, res) : geom_make_uv_sphere(1.0, res, Math.floor(res / 2), false, 2.0);
name: "Tessellated",
vertex_arrays: [
@@ -159,11 +159,11 @@ class TabMeshes {
- mo = mesh_object_create(md, Context.raw.paint_object.materials);
+ mo = mesh_object_create(md, context_raw.paint_object.materials);
array_remove(scene_meshes, mo);
mo.base.name = "Tessellated";
@@ -172,9 +172,9 @@ class TabMeshes {
mo.base.visible = true;
- Context.raw.paint_object = mo;
- Project.paint_objects[0] = mo;
+ context_raw.paint_object = mo;
+ project_paint_objects[0] = mo;
if (UIHeader.worktab.position == space_type_t.SPACE3D) {
scene_meshes = [mo];
@@ -21,7 +21,7 @@ class TabPlugins {
// Draw plugins
- for (let p of Plugin.plugins.values()) if (p.draw_ui != null) p.draw_ui(ui);
+ for (let p of plugin_map.values()) if (p.draw_ui != null) p.draw_ui(ui);
@@ -6,11 +6,11 @@ class TabScript {
if (zui_tab(htab, tr("Script")) && statush > UIStatus.default_status_h * zui_SCALE(ui)) {
zui_row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
@@ -21,7 +21,7 @@ class TabScript {
eval(TabScript.hscript.text);
catch(e: any) {
- Console.log(e);
+ console_log(e);
@@ -39,7 +39,7 @@ class TabScript {
UIFiles.show("js", true, false, (path: string) => {
if (!path.endsWith(".js")) path += ".js";