2
0
luboslenco 1 жил өмнө
parent
commit
d2f9dac175

BIN
armorlab/Assets/Scene.arm


BIN
armorpaint/Assets/Scene.arm


+ 46 - 46
armorpaint/Sources/MakeMaterial.ts

@@ -16,10 +16,10 @@ class MakeMaterial {
 	static parseMeshMaterial = () => {
 		let m = Project.materials[0].data;
 
-		for (let c of m._shader._contexts) {
+		for (let c of m._.shader._.contexts) {
 			if (c.name == "mesh") {
-				array_remove(m._shader.contexts, c);
-				array_remove(m._shader._contexts, c);
+				array_remove(m._.shader.contexts, c);
+				array_remove(m._.shader._.contexts, c);
 				MakeMaterial.deleteContext(c);
 				break;
 			}
@@ -27,12 +27,12 @@ class MakeMaterial {
 
 		if (MakeMesh.layerPassCount > 1) {
 			let i = 0;
-			while (i < m._shader._contexts.length) {
-				let c = m._shader._contexts[i];
+			while (i < m._.shader._.contexts.length) {
+				let c = m._.shader._.contexts[i];
 				for (let j = 1; j < MakeMesh.layerPassCount; ++j) {
 					if (c.name == "mesh" + j) {
-						array_remove(m._shader.contexts, c);
-						array_remove(m._shader._contexts, c);
+						array_remove(m._.shader.contexts, c);
+						array_remove(m._.shader._.contexts, c);
 						MakeMaterial.deleteContext(c);
 						i--;
 						break;
@@ -42,12 +42,12 @@ class MakeMaterial {
 			}
 
 			i = 0;
-			while (i < m._contexts.length) {
-				let c = m._contexts[i];
+			while (i < m._.contexts.length) {
+				let c = m._.contexts[i];
 				for (let j = 1; j < MakeMesh.layerPassCount; ++j) {
 					if (c.name == "mesh" + j) {
 						array_remove(m.contexts, c);
-						array_remove(m._contexts, c);
+						array_remove(m._.contexts, c);
 						i--;
 						break;
 					}
@@ -58,35 +58,35 @@ class MakeMaterial {
 
 		let con = MakeMesh.run({ name: "Material", canvas: null });
 		let scon: shader_context_t = shader_context_create(con.data);
-		scon._override_context = {};
+		scon._.override_context = {};
 		if (con.frag.sharedSamplers.length > 0) {
 			let sampler = con.frag.sharedSamplers[0];
-			scon._override_context.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
+			scon._.override_context.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
 		}
 		if (!Context.raw.textureFilter) {
-			scon._override_context.filter = "point";
+			scon._.override_context.filter = "point";
 		}
-		m._shader.contexts.push(scon);
-		m._shader._contexts.push(scon);
+		m._.shader.contexts.push(scon);
+		m._.shader._.contexts.push(scon);
 
 		for (let i = 1; i < MakeMesh.layerPassCount; ++i) {
 			let con = MakeMesh.run({ name: "Material", canvas: null }, i);
 			let scon: shader_context_t = shader_context_create(con.data);
-			scon._override_context = {};
+			scon._.override_context = {};
 			if (con.frag.sharedSamplers.length > 0) {
 				let sampler = con.frag.sharedSamplers[0];
-				scon._override_context.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
+				scon._.override_context.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
 			}
 			if (!Context.raw.textureFilter) {
-				scon._override_context.filter = "point";
+				scon._.override_context.filter = "point";
 			}
-			m._shader.contexts.push(scon);
-			m._shader._contexts.push(scon);
+			m._.shader.contexts.push(scon);
+			m._.shader._.contexts.push(scon);
 
 			let mcon: material_context_t;
 			mcon = material_context_create({ name: "mesh" + i, bind_textures: [] });
 			m.contexts.push(mcon);
-			m._contexts.push(mcon);
+			m._.contexts.push(mcon);
 		}
 
 		Context.raw.ddirty = 2;
@@ -103,21 +103,21 @@ class MakeMaterial {
 	static parseParticleMaterial = () => {
 		let m = Context.raw.particleMaterial;
 		let sc: shader_context_t = null;
-		for (let c of m._shader._contexts) {
+		for (let c of m._.shader._.contexts) {
 			if (c.name == "mesh") {
 				sc = c;
 				break;
 			}
 		}
 		if (sc != null) {
-			array_remove(m._shader.contexts, sc);
-			array_remove(m._shader._contexts, sc);
+			array_remove(m._.shader.contexts, sc);
+			array_remove(m._.shader._.contexts, sc);
 		}
 		let con = MakeParticle.run({ name: "MaterialParticle", canvas: null });
 		if (sc != null) MakeMaterial.deleteContext(sc);
 		sc = shader_context_create(con.data);
-		m._shader.contexts.push(sc);
-		m._shader._contexts.push(sc);
+		m._.shader.contexts.push(sc);
+		m._.shader._.contexts.push(sc);
 	}
 
 	static parseMeshPreviewMaterial = (md: material_data_t = null) => {
@@ -125,24 +125,24 @@ class MakeMaterial {
 
 		let m = md == null ? Project.materials[0].data : md;
 		let scon: shader_context_t = null;
-		for (let c of m._shader._contexts) {
+		for (let c of m._.shader._.contexts) {
 			if (c.name == "mesh") {
 				scon = c;
 				break;
 			}
 		}
 
-		array_remove(m._shader.contexts, scon);
-		array_remove(m._shader._contexts, scon);
+		array_remove(m._.shader.contexts, scon);
+		array_remove(m._.shader._.contexts, scon);
 
 		let mcon: material_context_t = { name: "mesh", bind_textures: [] };
 
 		let sd: TMaterial = { name: "Material", canvas: null };
 		let con = MakeMeshPreview.run(sd, mcon);
 
-		for (let i = 0; i < m._contexts.length; ++i) {
-			if (m._contexts[i].name == "mesh") {
-				m._contexts[i] = material_context_create(mcon);
+		for (let i = 0; i < m._.contexts.length; ++i) {
+			if (m._.contexts[i].name == "mesh") {
+				m._.contexts[i] = material_context_create(mcon);
 				break;
 			}
 		}
@@ -155,8 +155,8 @@ class MakeMaterial {
 		scon = _scon;
 		if (compileError) return;
 
-		m._shader.contexts.push(scon);
-		m._shader._contexts.push(scon);
+		m._.shader.contexts.push(scon);
+		m._.shader._.contexts.push(scon);
 	}
 
 	///if arm_voxels
@@ -164,7 +164,7 @@ class MakeMaterial {
 		let rebuild = MakeMaterial.heightUsed;
 		if (Config.raw.rp_gi != false && rebuild) {
 			let scon: shader_context_t = null;
-			for (let c of m._shader._contexts) {
+			for (let c of m._.shader._.contexts) {
 				if (c.name == "voxel") {
 					scon = c;
 					break;
@@ -188,18 +188,18 @@ class MakeMaterial {
 		let m = Project.materials[0].data;
 		// let scon: TShaderContext = null;
 		// let mcon: TMaterialContext = null;
-		for (let c of m._shader._contexts) {
+		for (let c of m._.shader._.contexts) {
 			if (c.name == "paint") {
-				array_remove(m._shader.contexts, c);
-				array_remove(m._shader._contexts, c);
+				array_remove(m._.shader.contexts, c);
+				array_remove(m._.shader._.contexts, c);
 				if (c != MakeMaterial.defaultScon) MakeMaterial.deleteContext(c);
 				break;
 			}
 		}
-		for (let c of m._contexts) {
+		for (let c of m._.contexts) {
 			if (c.name == "paint") {
 				array_remove(m.contexts, c);
-				array_remove(m._contexts, c);
+				array_remove(m._.contexts, c);
 				break;
 			}
 		}
@@ -214,14 +214,14 @@ class MakeMaterial {
 		if (_scon == null) compileError = true;
 		scon = _scon;
 		if (compileError) return;
-		scon._override_context = {};
-		scon._override_context.addressing = "repeat";
+		scon._.override_context = {};
+		scon._.override_context.addressing = "repeat";
 		let mcon: material_context_t = material_context_create(tmcon);
 
-		m._shader.contexts.push(scon);
-		m._shader._contexts.push(scon);
+		m._.shader.contexts.push(scon);
+		m._.shader._.contexts.push(scon);
 		m.contexts.push(mcon);
-		m._contexts.push(mcon);
+		m._.contexts.push(mcon);
 
 		if (MakeMaterial.defaultScon == null) MakeMaterial.defaultScon = scon;
 		if (MakeMaterial.defaultMcon == null) MakeMaterial.defaultMcon = mcon;
@@ -337,7 +337,7 @@ class MakeMaterial {
 			let texpaint_live = rts.get("texpaint_live");
 
 			g2_begin(image);
-			g2_draw_image(texpaint_live.image, 0, 0);
+			g2_draw_image(texpaint_live._image, 0, 0);
 			g2_end();
 		}
 	}

+ 9 - 9
armorpaint/Sources/RenderPathPaint.ts

@@ -151,8 +151,8 @@ class RenderPathPaint {
 					render_path_bind_target("gbuffer2", "gbuffer2");
 					render_path_bind_target("_main", "gbufferD");
 					render_path_draw_meshes("paint");
-					let texpaint_posnortex_picker0 = render_path_render_targets.get("texpaint_posnortex_picker0").image;
-					let texpaint_posnortex_picker1 = render_path_render_targets.get("texpaint_posnortex_picker1").image;
+					let texpaint_posnortex_picker0 = render_path_render_targets.get("texpaint_posnortex_picker0")._image;
+					let texpaint_posnortex_picker1 = render_path_render_targets.get("texpaint_posnortex_picker1")._image;
 					let a = new DataView(image_get_pixels(texpaint_posnortex_picker0));
 					let b = new DataView(image_get_pixels(texpaint_posnortex_picker1));
 					Context.raw.posXPicked = a.getFloat32(0, true);
@@ -178,10 +178,10 @@ class RenderPathPaint {
 					UIHeader.headerHandle.redraws = 2;
 					UIBase.hwnds[2].redraws = 2;
 
-					let texpaint_picker = render_path_render_targets.get("texpaint_picker").image;
-					let texpaint_nor_picker = render_path_render_targets.get("texpaint_nor_picker").image;
-					let texpaint_pack_picker = render_path_render_targets.get("texpaint_pack_picker").image;
-					let texpaint_uv_picker = render_path_render_targets.get("texpaint_uv_picker").image;
+					let texpaint_picker = render_path_render_targets.get("texpaint_picker")._image;
+					let texpaint_nor_picker = render_path_render_targets.get("texpaint_nor_picker")._image;
+					let texpaint_pack_picker = render_path_render_targets.get("texpaint_pack_picker")._image;
+					let texpaint_uv_picker = render_path_render_targets.get("texpaint_uv_picker")._image;
 					let a = new DataView(image_get_pixels(texpaint_picker));
 					let b = new DataView(image_get_pixels(texpaint_nor_picker));
 					let c = new DataView(image_get_pixels(texpaint_pack_picker));
@@ -506,7 +506,7 @@ class RenderPathPaint {
 		let decalMask = decal && Operator.shortcut(Config.keymap.decal_mask, ShortcutType.ShortcutDown);
 		let img = (decal && !decalMask) ? Context.raw.decalImage : Res.get("cursor.k");
 		g4_set_tex(Base.cursorTex, img);
-		let gbuffer0 = render_path_render_targets.get("gbuffer0").image;
+		let gbuffer0 = render_path_render_targets.get("gbuffer0")._image;
 		g4_set_tex_depth(Base.cursorGbufferD, gbuffer0);
 		g4_set_float2(Base.cursorMouse, mx, my);
 		g4_set_float2(Base.cursorTexStep, 1 / gbuffer0.width, 1 / gbuffer0.height);
@@ -521,9 +521,9 @@ class RenderPathPaint {
 		///if (krom_metal || krom_vulkan)
 		g4_set_vertex_buffer(mesh_data_get(geom, [{name: "tex", data: "short2norm"}]));
 		///else
-		g4_set_vertex_buffer(geom._vertex_buffer);
+		g4_set_vertex_buffer(geom._.vertex_buffer);
 		///end
-		g4_set_index_buffer(geom._index_buffers[0]);
+		g4_set_index_buffer(geom._.index_buffers[0]);
 		g4_draw();
 
 		g4_disable_scissor();

+ 3 - 3
armorpaint/Sources/RenderPathPreview.ts

@@ -105,8 +105,8 @@ class RenderPathPreview {
 
 		let framebuffer = "texpreview";
 		let selectedMat = Context.raw.material;
-		render_path_render_targets.get("texpreview").image = selectedMat.image;
-		render_path_render_targets.get("texpreview_icon").image = selectedMat.imageIcon;
+		render_path_render_targets.get("texpreview")._image = selectedMat.image;
+		render_path_render_targets.get("texpreview_icon")._image = selectedMat.imageIcon;
 
 		render_path_set_target(framebuffer);
 		render_path_bind_target("mtex", "tex");
@@ -154,7 +154,7 @@ class RenderPathPreview {
 		///end
 
 		let framebuffer = "texpreview";
-		render_path_render_targets.get("texpreview").image = Context.raw.decalImage;
+		render_path_render_targets.get("texpreview")._image = Context.raw.decalImage;
 
 		render_path_set_target(framebuffer);
 

+ 15 - 15
armorpaint/Sources/SlotLayer.ts

@@ -68,7 +68,7 @@ class SlotLayer {
 				t.width = Config.getTextureResX();
 				t.height = Config.getTextureResY();
 				t.format = format;
-				raw.texpaint = render_path_create_render_target(t).image;
+				raw.texpaint = render_path_create_render_target(t)._image;
 			}
 
 			///if is_paint
@@ -78,7 +78,7 @@ class SlotLayer {
 				t.width = Config.getTextureResX();
 				t.height = Config.getTextureResY();
 				t.format = format;
-				raw.texpaint_nor = render_path_create_render_target(t).image;
+				raw.texpaint_nor = render_path_create_render_target(t)._image;
 			}
 			{
 				let t = render_target_create();
@@ -86,7 +86,7 @@ class SlotLayer {
 				t.width = Config.getTextureResX();
 				t.height = Config.getTextureResY();
 				t.format = format;
-				raw.texpaint_pack = render_path_create_render_target(t).image;
+				raw.texpaint_pack = render_path_create_render_target(t)._image;
 			}
 
 			raw.texpaint_preview = image_create_render_target(UtilRender.layerPreviewSize, UtilRender.layerPreviewSize, tex_format_t.RGBA32);
@@ -105,7 +105,7 @@ class SlotLayer {
 				t.width = Config.getTextureResX();
 				t.height = Config.getTextureResY();
 				t.format = format;
-				raw.texpaint = render_path_create_render_target(t).image;
+				raw.texpaint = render_path_create_render_target(t)._image;
 			}
 
 			raw.texpaint_preview = image_create_render_target(UtilRender.layerPreviewSize, UtilRender.layerPreviewSize, tex_format_t.RGBA32);
@@ -170,8 +170,8 @@ class SlotLayer {
 
 	static swap = (raw: SlotLayerRaw, other: SlotLayerRaw) => {
 		if ((SlotLayer.isLayer(raw) || SlotLayer.isMask(raw)) && (SlotLayer.isLayer(other) || SlotLayer.isMask(other))) {
-			render_path_render_targets.get("texpaint" + raw.ext).image = other.texpaint;
-			render_path_render_targets.get("texpaint" + other.ext).image = raw.texpaint;
+			render_path_render_targets.get("texpaint" + raw.ext)._image = other.texpaint;
+			render_path_render_targets.get("texpaint" + other.ext)._image = raw.texpaint;
 			let _texpaint = raw.texpaint;
 			raw.texpaint = other.texpaint;
 			other.texpaint = _texpaint;
@@ -185,10 +185,10 @@ class SlotLayer {
 
 		///if is_paint
 		if (SlotLayer.isLayer(raw) && SlotLayer.isLayer(other)) {
-			render_path_render_targets.get("texpaint_nor" + raw.ext).image = other.texpaint_nor;
-			render_path_render_targets.get("texpaint_pack" + raw.ext).image = other.texpaint_pack;
-			render_path_render_targets.get("texpaint_nor" + other.ext).image = raw.texpaint_nor;
-			render_path_render_targets.get("texpaint_pack" + other.ext).image = raw.texpaint_pack;
+			render_path_render_targets.get("texpaint_nor" + raw.ext)._image = other.texpaint_nor;
+			render_path_render_targets.get("texpaint_pack" + raw.ext)._image = other.texpaint_pack;
+			render_path_render_targets.get("texpaint_nor" + other.ext)._image = raw.texpaint_nor;
+			render_path_render_targets.get("texpaint_pack" + other.ext)._image = raw.texpaint_pack;
 			let _texpaint_nor = raw.texpaint_nor;
 			let _texpaint_pack = raw.texpaint_pack;
 			raw.texpaint_nor = other.texpaint_nor;
@@ -237,7 +237,7 @@ class SlotLayer {
 			image_unload(_texpaint);
 		}
 		Base.notifyOnNextFrame(_next);
-		raw.texpaint = render_path_render_targets.get("texpaint" + raw.id).image = inverted;
+		raw.texpaint = render_path_render_targets.get("texpaint" + raw.id)._image = inverted;
 		Context.raw.layerPreviewDirty = true;
 		Context.raw.ddirty = 3;
 	}
@@ -376,10 +376,10 @@ class SlotLayer {
 			}
 			Base.notifyOnNextFrame(_next);
 
-			rts.get("texpaint" + raw.ext).image = raw.texpaint;
+			rts.get("texpaint" + raw.ext)._image = raw.texpaint;
 			///if is_paint
-			rts.get("texpaint_nor" + raw.ext).image = raw.texpaint_nor;
-			rts.get("texpaint_pack" + raw.ext).image = raw.texpaint_pack;
+			rts.get("texpaint_nor" + raw.ext)._image = raw.texpaint_nor;
+			rts.get("texpaint_pack" + raw.ext)._image = raw.texpaint_pack;
 			///end
 		}
 		else if (SlotLayer.isMask(raw)) {
@@ -397,7 +397,7 @@ class SlotLayer {
 			}
 			Base.notifyOnNextFrame(_next);
 
-			rts.get("texpaint" + raw.ext).image = raw.texpaint;
+			rts.get("texpaint" + raw.ext)._image = raw.texpaint;
 		}
 	}
 

BIN
armorsculpt/Assets/Scene.arm


BIN
base/Assets/shader_datas.arm


+ 26 - 26
base/Sources/Base.ts

@@ -1012,9 +1012,9 @@ class Base {
 		///end
 
 		///if is_lab
-		let texpaint = render_path_render_targets.get("texpaint").image;
-		let texpaint_nor = render_path_render_targets.get("texpaint_nor").image;
-		let texpaint_pack = render_path_render_targets.get("texpaint_pack").image;
+		let texpaint = render_path_render_targets.get("texpaint")._image;
+		let texpaint_nor = render_path_render_targets.get("texpaint_nor")._image;
+		let texpaint_pack = render_path_render_targets.get("texpaint_pack")._image;
 		g2_begin(texpaint);
 		g2_draw_scaled_image(Res.get("placeholder.k"), 0, 0, Config.getTextureResX(), Config.getTextureResY()); // Base
 		g2_end();
@@ -1024,8 +1024,8 @@ class Base {
 		g4_begin(texpaint_pack);
 		g4_clear(color_from_floats(1.0, 0.4, 0.0, 0.0)); // Occ, rough, met
 		g4_end();
-		let texpaint_nor_empty = render_path_render_targets.get("texpaint_nor_empty").image;
-		let texpaint_pack_empty = render_path_render_targets.get("texpaint_pack_empty").image;
+		let texpaint_nor_empty = render_path_render_targets.get("texpaint_nor_empty")._image;
+		let texpaint_pack_empty = render_path_render_targets.get("texpaint_pack_empty")._image;
 		g4_begin(texpaint_nor_empty);
 		g4_clear(color_from_floats(0.5, 0.5, 1.0, 0.0)); // Nor
 		g4_end();
@@ -1053,23 +1053,23 @@ class Base {
 		for (let l of Project.layers) SlotLayer.resizeAndSetBits(l);
 		for (let l of History.undoLayers) SlotLayer.resizeAndSetBits(l);
 		let rts = render_path_render_targets;
-		let _texpaint_blend0 = rts.get("texpaint_blend0").image;
+		let _texpaint_blend0 = rts.get("texpaint_blend0")._image;
 		Base.notifyOnNextFrame(() => {
 			image_unload(_texpaint_blend0);
 		});
 		rts.get("texpaint_blend0").width = Config.getTextureResX();
 		rts.get("texpaint_blend0").height = Config.getTextureResY();
-		rts.get("texpaint_blend0").image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY(), tex_format_t.R8);
-		let _texpaint_blend1 = rts.get("texpaint_blend1").image;
+		rts.get("texpaint_blend0")._image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY(), tex_format_t.R8);
+		let _texpaint_blend1 = rts.get("texpaint_blend1")._image;
 		Base.notifyOnNextFrame(() => {
 			image_unload(_texpaint_blend1);
 		});
 		rts.get("texpaint_blend1").width = Config.getTextureResX();
 		rts.get("texpaint_blend1").height = Config.getTextureResY();
-		rts.get("texpaint_blend1").image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY(), tex_format_t.R8);
+		rts.get("texpaint_blend1")._image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY(), tex_format_t.R8);
 		Context.raw.brushBlendDirty = true;
 		if (rts.get("texpaint_blur") != null) {
-			let _texpaint_blur = rts.get("texpaint_blur").image;
+			let _texpaint_blur = rts.get("texpaint_blur")._image;
 			Base.notifyOnNextFrame(() => {
 				image_unload(_texpaint_blur);
 			});
@@ -1077,7 +1077,7 @@ class Base {
 			let sizeY = Math.floor(Config.getTextureResY() * 0.95);
 			rts.get("texpaint_blur").width = sizeX;
 			rts.get("texpaint_blur").height = sizeY;
-			rts.get("texpaint_blur").image = image_create_render_target(sizeX, sizeY);
+			rts.get("texpaint_blur")._image = image_create_render_target(sizeX, sizeY);
 		}
 		if (RenderPathPaint.liveLayer != null) SlotLayer.resizeAndSetBits(RenderPathPaint.liveLayer);
 		///if (krom_direct3d12 || krom_vulkan || krom_metal)
@@ -1383,7 +1383,7 @@ class Base {
 			t.height = l.texpaint.height;
 			t.format = format;
 			let rt = render_path_create_render_target(t);
-			Base.tempImage = rt.image;
+			Base.tempImage = rt._image;
 		}
 	}
 
@@ -1443,7 +1443,7 @@ class Base {
 				t.height = l.texpaint.height;
 				t.format = format;
 				let rt = render_path_create_render_target(t);
-				Base.expa = rt.image;
+				Base.expa = rt._image;
 			}
 
 			{
@@ -1453,7 +1453,7 @@ class Base {
 				t.height = l.texpaint.height;
 				t.format = format;
 				let rt = render_path_create_render_target(t);
-				Base.expb = rt.image;
+				Base.expb = rt._image;
 			}
 
 			{
@@ -1463,7 +1463,7 @@ class Base {
 				t.height = l.texpaint.height;
 				t.format = format;
 				let rt = render_path_create_render_target(t);
-				Base.expc = rt.image;
+				Base.expc = rt._image;
 			}
 		}
 	}
@@ -1602,7 +1602,7 @@ class Base {
 		g2_set_pipeline(null);
 		g2_end();
 
-		let empty = render_path_render_targets.get("empty_white").image;
+		let empty = render_path_render_targets.get("empty_white")._image;
 		let mask = empty;
 		let l1masks =  use_mask ? SlotLayer.getMasks(l1) : null;
 		if (l1masks != null) {
@@ -1689,7 +1689,7 @@ class Base {
 		Base.makeExportImg();
 		if (Base.pipeMerge == null) Base.makePipe();
 		if (const_data_screen_aligned_vb == null) const_data_create_screen_aligned_data();
-		let empty = render_path_render_targets.get("empty_white").image;
+		let empty = render_path_render_targets.get("empty_white")._image;
 
 		// Clear export layer
 		g4_begin(Base.expa);
@@ -2143,8 +2143,8 @@ class Base {
 			let brushNode = ParserLogic.getLogicNode(node);
 			if (brushNode != null && brushNode.getCachedImage() != null) {
 				texpaint = brushNode.getCachedImage();
-				texpaint_nor = render_path_render_targets.get("texpaint_nor_empty").image;
-				texpaint_pack = render_path_render_targets.get("texpaint_pack_empty").image;
+				texpaint_nor = render_path_render_targets.get("texpaint_nor_empty")._image;
+				texpaint_pack = render_path_render_targets.get("texpaint_pack_empty")._image;
 			}
 		}
 
@@ -2153,11 +2153,11 @@ class Base {
 
 	static onLayersResized = () => {
 		image_unload(BrushOutputNode.inst.texpaint);
-		BrushOutputNode.inst.texpaint = render_path_render_targets.get("texpaint").image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY());
+		BrushOutputNode.inst.texpaint = render_path_render_targets.get("texpaint")._image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY());
 		image_unload(BrushOutputNode.inst.texpaint_nor);
-		BrushOutputNode.inst.texpaint_nor = render_path_render_targets.get("texpaint_nor").image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY());
+		BrushOutputNode.inst.texpaint_nor = render_path_render_targets.get("texpaint_nor")._image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY());
 		image_unload(BrushOutputNode.inst.texpaint_pack);
-		BrushOutputNode.inst.texpaint_pack = render_path_render_targets.get("texpaint_pack").image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY());
+		BrushOutputNode.inst.texpaint_pack = render_path_render_targets.get("texpaint_pack")._image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY());
 
 		if (InpaintNode.image != null) {
 			image_unload(InpaintNode.image);
@@ -2179,10 +2179,10 @@ class Base {
 			TilingNode.init();
 		}
 
-		image_unload(render_path_render_targets.get("texpaint_blend0").image);
-		render_path_render_targets.get("texpaint_blend0").image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY(), tex_format_t.R8);
-		image_unload(render_path_render_targets.get("texpaint_blend1").image);
-		render_path_render_targets.get("texpaint_blend1").image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY(), tex_format_t.R8);
+		image_unload(render_path_render_targets.get("texpaint_blend0")._image);
+		render_path_render_targets.get("texpaint_blend0")._image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY(), tex_format_t.R8);
+		image_unload(render_path_render_targets.get("texpaint_blend1")._image);
+		render_path_render_targets.get("texpaint_blend1")._image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY(), tex_format_t.R8);
 
 		if (render_path_render_targets.get("texpaint_node") != null) {
 			render_path_render_targets.delete("texpaint_node");

+ 1 - 1
base/Sources/BoxPreferences.ts

@@ -207,7 +207,7 @@ class BoxPreferences {
 					Context.raw.emptyEnvmap = image_from_bytes(b.buffer, 1, 1);
 					Context.raw.ddirty = 2;
 					if (!Context.raw.showEnvmap) {
-						scene_world._envmap = Context.raw.emptyEnvmap;
+						scene_world._.envmap = Context.raw.emptyEnvmap;
 					}
 				}
 

+ 3 - 3
base/Sources/Context.ts

@@ -277,15 +277,15 @@ class Context {
 			data_cached_images.delete("World_radiance.k");
 		}
 		world_data_load_envmap(scene_world, (_) => {});
-		if (Context.raw.savedEnvmap == null) Context.raw.savedEnvmap = scene_world._envmap;
+		if (Context.raw.savedEnvmap == null) Context.raw.savedEnvmap = scene_world._.envmap;
 	}
 
 	static updateEnvmap = () => {
 		if (Context.raw.showEnvmap) {
-			scene_world._envmap = Context.raw.showEnvmapBlur ? scene_world._radiance_mipmaps[0] : Context.raw.savedEnvmap;
+			scene_world._.envmap = Context.raw.showEnvmapBlur ? scene_world._.radiance_mipmaps[0] : Context.raw.savedEnvmap;
 		}
 		else {
-			scene_world._envmap = Context.raw.emptyEnvmap;
+			scene_world._.envmap = Context.raw.emptyEnvmap;
 		}
 	}
 

+ 1 - 1
base/Sources/ExportArm.ts

@@ -138,7 +138,7 @@ class ExportArm {
 		};
 
 		///if (krom_android || krom_ios)
-		let tex = render_path_render_targets.get(Context.raw.renderMode == RenderMode.RenderForward ? "buf" : "tex").image;
+		let tex = render_path_render_targets.get(Context.raw.renderMode == RenderMode.RenderForward ? "buf" : "tex")._image;
 		let mesh_icon = image_create_render_target(256, 256);
 		let r = app_w() / app_h();
 		g2_begin(mesh_icon);

+ 1 - 1
base/Sources/ExportTexture.ts

@@ -141,7 +141,7 @@ class ExportTexture {
 		Base.makeExportImg();
 		if (Base.pipeMerge == null) Base.makePipe();
 		if (const_data_screen_aligned_vb == null) const_data_create_screen_aligned_data();
-		let empty = render_path_render_targets.get("empty_white").image;
+		let empty = render_path_render_targets.get("empty_white")._image;
 
 		// Append object mask name
 		let exportSelected = Context.raw.layersExport == ExportMode.ExportSelected;

+ 6 - 6
base/Sources/ImportArm.ts

@@ -173,20 +173,20 @@ class ImportArm {
 		if (tex.width != Config.getTextureResX() || tex.height != Config.getTextureResY()) {
 			if (History.undoLayers != null) for (let l of History.undoLayers) SlotLayer.resizeAndSetBits(l);
 			let rts = render_path_render_targets;
-			let _texpaint_blend0 = rts.get("texpaint_blend0").image;
+			let _texpaint_blend0 = rts.get("texpaint_blend0")._image;
 			Base.notifyOnNextFrame(() => {
 				image_unload(_texpaint_blend0);
 			});
 			rts.get("texpaint_blend0").width = Config.getTextureResX();
 			rts.get("texpaint_blend0").height = Config.getTextureResY();
-			rts.get("texpaint_blend0").image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY(), tex_format_t.R8, depth_format_t.NO_DEPTH);
-			let _texpaint_blend1 = rts.get("texpaint_blend1").image;
+			rts.get("texpaint_blend0")._image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY(), tex_format_t.R8, depth_format_t.NO_DEPTH);
+			let _texpaint_blend1 = rts.get("texpaint_blend1")._image;
 			Base.notifyOnNextFrame(() => {
 				image_unload(_texpaint_blend1);
 			});
 			rts.get("texpaint_blend1").width = Config.getTextureResX();
 			rts.get("texpaint_blend1").height = Config.getTextureResY();
-			rts.get("texpaint_blend1").image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY(), tex_format_t.R8, depth_format_t.NO_DEPTH);
+			rts.get("texpaint_blend1")._image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY(), tex_format_t.R8, depth_format_t.NO_DEPTH);
 			Context.raw.brushBlendDirty = true;
 		}
 
@@ -367,8 +367,8 @@ class ImportArm {
 				object = scene_add_mesh_object(md, Context.raw.paintObject.materials, Context.raw.paintObject.base);
 				object.base.name = md.name;
 				object.skip_context = "paint";
-				md._handle = md.name;
-				data_cached_meshes.set(md._handle, md);
+				md._.handle = md.name;
+				data_cached_meshes.set(md._.handle, md);
 			}
 			vec4_set(object.base.transform.scale, 1, 1, 1);
 			transform_build_matrix(object.base.transform);

+ 7 - 7
base/Sources/ImportEnvmap.ts

@@ -53,7 +53,7 @@ class ImportEnvmap {
 				image_unload(_radianceCpu);
 			});
 		}
-		ImportEnvmap.radianceCpu = image_from_bytes(radiancePixels, ImportEnvmap.radiance.width, ImportEnvmap.radiance.height, tex_format_t.RGBA128, usage_t.DYNAMIC);
+		ImportEnvmap.radianceCpu = image_from_bytes(radiancePixels, ImportEnvmap.radiance.width, ImportEnvmap.radiance.height, tex_format_t.RGBA128);
 
 		// Radiance
 		if (ImportEnvmap.mipsCpu != null) {
@@ -69,23 +69,23 @@ class ImportEnvmap {
 		ImportEnvmap.mipsCpu = [];
 		for (let i = 0; i < ImportEnvmap.mips.length; ++i) {
 			ImportEnvmap.getRadianceMip(ImportEnvmap.mips[i], i, ImportEnvmap.radiance);
-			ImportEnvmap.mipsCpu.push(image_from_bytes(image_get_pixels(ImportEnvmap.mips[i]), ImportEnvmap.mips[i].width, ImportEnvmap.mips[i].height, tex_format_t.RGBA128, usage_t.DYNAMIC));
+			ImportEnvmap.mipsCpu.push(image_from_bytes(image_get_pixels(ImportEnvmap.mips[i]), ImportEnvmap.mips[i].width, ImportEnvmap.mips[i].height, tex_format_t.RGBA128));
 		}
 		image_set_mipmaps(ImportEnvmap.radianceCpu, ImportEnvmap.mipsCpu);
 
 		// Irradiance
-		scene_world._irradiance = ImportEnvmap.getSphericalHarmonics(radiancePixels, ImportEnvmap.radiance.width, ImportEnvmap.radiance.height);
+		scene_world._.irradiance = ImportEnvmap.getSphericalHarmonics(radiancePixels, ImportEnvmap.radiance.width, ImportEnvmap.radiance.height);
 
 		// World
 		scene_world.strength = 1.0;
 		scene_world.radiance_mipmaps = ImportEnvmap.mipsCpu.length - 2;
-		scene_world._envmap = image;
+		scene_world._.envmap = image;
 		scene_world.envmap = path;
-		scene_world._radiance = ImportEnvmap.radianceCpu;
-		scene_world._radiance_mipmaps = ImportEnvmap.mipsCpu;
+		scene_world._.radiance = ImportEnvmap.radianceCpu;
+		scene_world._.radiance_mipmaps = ImportEnvmap.mipsCpu;
 		Context.raw.savedEnvmap = image;
 		if (Context.raw.showEnvmapBlur) {
-			scene_world._envmap = scene_world._radiance_mipmaps[0];
+			scene_world._.envmap = scene_world._.radiance_mipmaps[0];
 		}
 		Context.raw.ddirty = 2;
 		Project.raw.envmap = path;

+ 8 - 8
base/Sources/ImportMesh.ts

@@ -113,10 +113,10 @@ class ImportMesh {
 		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);
+			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);
 		}
@@ -125,8 +125,8 @@ class ImportMesh {
 		Context.raw.paintObject.base.name = mesh.name;
 		Project.paintObjects = [Context.raw.paintObject];
 
-		md._handle = raw.name;
-		data_cached_meshes.set(md._handle, md);
+		md._.handle = raw.name;
+		data_cached_meshes.set(md._.handle, md);
 
 		Context.raw.ddirty = 4;
 
@@ -194,15 +194,15 @@ class ImportMesh {
 		for (let p of Project.paintObjects) {
 			if (p.base.name == object.base.name) {
 				p.base.name += ".001";
-				p.data._handle += ".001";
-				data_cached_meshes.set(p.data._handle, p.data);
+				p.data._.handle += ".001";
+				data_cached_meshes.set(p.data._.handle, p.data);
 			}
 		}
 
 		Project.paintObjects.push(object);
 
-		md._handle = raw.name;
-		data_cached_meshes.set(md._handle, md);
+		md._.handle = raw.name;
+		data_cached_meshes.set(md._.handle, md);
 
 		Context.raw.ddirty = 4;
 

+ 4 - 4
base/Sources/MakeVoxel.ts

@@ -8,7 +8,7 @@ class MakeVoxel {
 		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 pipeState = data._pipe_state;
+		let pipeState = data._.pipe_state;
 		pipeState.input_layout = [structure];
 		data.vertex_elements = [{name: "pos", data: "short4norm"}, {name: "nor", data: "short2norm"}, {name: "tex", data: "short2norm"}];
 
@@ -28,9 +28,9 @@ class MakeVoxel {
 
 		g4_pipeline_compile(pipeState);
 		data.constants = [{ name: "W", type: "mat4", link: "_world_matrix" }, { name: "N", type: "mat3", link: "_normal_matrix" }];
-		data._constants = [g4_pipeline_get_const_loc(pipeState, "W"), g4_pipeline_get_const_loc(pipeState, "N")];
-		data.texture_units = [{ name: "texpaint_pack" }, { name: "voxels", is_image: true }];
-		data._tex_units = [g4_pipeline_get_tex_unit(pipeState, "texpaint_pack"), g4_pipeline_get_tex_unit(pipeState, "voxels")];
+		data._.constants = [g4_pipeline_get_const_loc(pipeState, "W"), g4_pipeline_get_const_loc(pipeState, "N")];
+		data.texture_units = [{ name: "texpaint_pack" }, { name: "voxels", image_uniform: true }];
+		data._.tex_units = [g4_pipeline_get_tex_unit(pipeState, "texpaint_pack"), g4_pipeline_get_tex_unit(pipeState, "voxels")];
 	}
 
 	static voxelSource = (): string => {

+ 1 - 1
base/Sources/NodeShaderContext.ts

@@ -102,7 +102,7 @@ class NodeShaderContext {
 			c.link = link;
 		}
 		if (is_image) {
-			c.is_image = is_image;
+			c.image_uniform = is_image;
 		}
 		raw.tunits.push(c);
 	}

+ 8 - 8
base/Sources/Project.ts

@@ -124,7 +124,7 @@ class Project {
 		///if (is_paint || is_sculpt)
 		if (Context.raw.mergedObject != null) {
 			mesh_object_remove(Context.raw.mergedObject);
-			data_delete_mesh(Context.raw.mergedObject.data._handle);
+			data_delete_mesh(Context.raw.mergedObject.data._.handle);
 			Context.raw.mergedObject = null;
 		}
 		Context.raw.layerPreviewDirty = true;
@@ -139,7 +139,7 @@ class Project {
 		for (let i = 1; i < Project.paintObjects.length; ++i) {
 			let p = Project.paintObjects[i];
 			if (p == Context.raw.paintObject) continue;
-			data_delete_mesh(p.data._handle);
+			data_delete_mesh(p.data._.handle);
 			mesh_object_remove(p);
 		}
 		let meshes = scene_meshes;
@@ -149,11 +149,11 @@ class Project {
 			if (Context.raw.projectObjects.indexOf(m) == -1 &&
 				m.base.name != ".ParticleEmitter" &&
 				m.base.name != ".Particle") {
-				data_delete_mesh(m.data._handle);
+				data_delete_mesh(m.data._.handle);
 				mesh_object_remove(m);
 			}
 		}
-		let handle = Context.raw.paintObject.data._handle;
+		let handle = Context.raw.paintObject.data._.handle;
 		if (handle != "SceneSphere" && handle != "ScenePlane") {
 			data_delete_mesh(handle);
 		}
@@ -289,12 +289,12 @@ class Project {
 
 		Context.raw.savedEnvmap = null;
 		Context.raw.envmapLoaded = false;
-		scene_world._envmap = Context.raw.emptyEnvmap;
+		scene_world._.envmap = Context.raw.emptyEnvmap;
 		scene_world.envmap = "World_radiance.k";
 		Context.raw.showEnvmapHandle.selected = Context.raw.showEnvmap = false;
-		scene_world._radiance = Context.raw.defaultRadiance;
-		scene_world._radiance_mipmaps = Context.raw.defaultRadianceMipmaps;
-		scene_world._irradiance = Context.raw.defaultIrradiance;
+		scene_world._.radiance = Context.raw.defaultRadiance;
+		scene_world._.radiance_mipmaps = Context.raw.defaultRadianceMipmaps;
+		scene_world._.irradiance = Context.raw.defaultIrradiance;
 		scene_world.strength = 4.0;
 
 		///if (is_paint || is_sculpt)

+ 1 - 1
base/Sources/RenderPathBase.ts

@@ -539,7 +539,7 @@ class RenderPathBase {
 
 	static makeGbufferCopyTextures = () => {
 		let copy = render_path_render_targets.get("gbuffer0_copy");
-		if (copy == null || copy.image.width != render_path_render_targets.get("gbuffer0").image.width || copy.image.height != render_path_render_targets.get("gbuffer0").image.height) {
+		if (copy == null || copy._image.width != render_path_render_targets.get("gbuffer0")._image.width || copy._image.height != render_path_render_targets.get("gbuffer0")._image.height) {
 			{
 				let t = render_target_create();
 				t.name = "gbuffer0_copy";

+ 2 - 2
base/Sources/RenderPathDeferred.ts

@@ -95,7 +95,7 @@ class RenderPathDeferred {
 			let b = new ArrayBuffer(1);
 			let v = new DataView(b);
 			v.setUint8(0, 255);
-			t.image = image_from_bytes(b, t.width, t.height, tex_format_t.R8);
+			t._image = image_from_bytes(b, t.width, t.height, tex_format_t.R8);
 			render_path_render_targets.set(t.name, t);
 		}
 		{
@@ -110,7 +110,7 @@ class RenderPathDeferred {
 			v.setUint8(1, 0);
 			v.setUint8(2, 0);
 			v.setUint8(3, 0);
-			t.image = image_from_bytes(b, t.width, t.height, tex_format_t.RGBA32);
+			t._image = image_from_bytes(b, t.width, t.height, tex_format_t.RGBA32);
 			render_path_render_targets.set(t.name, t);
 		}
 

+ 1 - 1
base/Sources/RenderPathRaytrace.ts

@@ -117,7 +117,7 @@ class RenderPathRaytrace {
 		RenderPathRaytrace.f32a[22] *= scene_meshes[0].data.scale_tex;
 		///end
 
-		let framebuffer = render_path_render_targets.get("buf").image;
+		let framebuffer = 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) {

+ 7 - 7
base/Sources/RenderPathRaytraceBake.ts

@@ -22,9 +22,9 @@ class RenderPathRaytraceBake {
 			RenderPathRaytraceBake.lastLayer = null;
 
 			if (render_path_render_targets.get("baketex0") != null) {
-				image_unload(render_path_render_targets.get("baketex0").image);
-				image_unload(render_path_render_targets.get("baketex1").image);
-				image_unload(render_path_render_targets.get("baketex2").image);
+				image_unload(render_path_render_targets.get("baketex0")._image);
+				image_unload(render_path_render_targets.get("baketex1")._image);
+				image_unload(render_path_render_targets.get("baketex2")._image);
 			}
 
 			{
@@ -80,12 +80,12 @@ class RenderPathRaytraceBake {
 			RenderPathRaytrace.lastEnvmap = savedEnvmap;
 			RenderPathRaytraceBake.lastLayer = Context.raw.layer.texpaint;
 
-			let baketex0 = render_path_render_targets.get("baketex0").image;
-			let baketex1 = render_path_render_targets.get("baketex1").image;
+			let baketex0 = render_path_render_targets.get("baketex0")._image;
+			let baketex1 = render_path_render_targets.get("baketex1")._image;
 			let bnoise_sobol = scene_embedded.get("bnoise_sobol.k");
 			let bnoise_scramble = scene_embedded.get("bnoise_scramble.k");
 			let bnoise_rank = scene_embedded.get("bnoise_rank.k");
-			let texpaint_undo = render_path_render_targets.get("texpaint_undo" + History.undoI).image;
+			let texpaint_undo = render_path_render_targets.get("texpaint_undo" + History.undoI)._image;
 			krom_raytrace_set_textures(baketex0, baketex1, texpaint_undo, savedEnvmap.texture_, bnoise_sobol.texture_, bnoise_scramble.texture_, bnoise_rank.texture_);
 		}
 
@@ -104,7 +104,7 @@ class RenderPathRaytraceBake {
 			f32a[5] = Context.raw.bakeUpAxis;
 			f32a[6] = Context.raw.envmapAngle;
 
-			let framebuffer = render_path_render_targets.get("baketex2").image;
+			let framebuffer = 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);

+ 1 - 1
base/Sources/TabMeshes.ts

@@ -125,7 +125,7 @@ class TabMeshes {
 									transform_build_matrix(Project.paintObjects[0].base.transform);
 								}
 							}
-							data_delete_mesh(o.data._handle);
+							data_delete_mesh(o.data._.handle);
 							mesh_object_remove(o);
 							Context.raw.paintObject = Context.mainObject();
 							UtilMesh.mergeMesh();

+ 4 - 4
base/Sources/UIBase.ts

@@ -191,11 +191,11 @@ class UIBase {
 		let world = scene_world;
 		if (Context.raw.savedEnvmap == null) {
 			// Context.raw.savedEnvmap = world._envmap;
-			Context.raw.defaultIrradiance = world._irradiance;
-			Context.raw.defaultRadiance = world._radiance;
-			Context.raw.defaultRadianceMipmaps = world._radiance_mipmaps;
+			Context.raw.defaultIrradiance = world._.irradiance;
+			Context.raw.defaultRadiance = world._.radiance;
+			Context.raw.defaultRadianceMipmaps = world._.radiance_mipmaps;
 		}
-		world._envmap = Context.raw.showEnvmap ? Context.raw.savedEnvmap : Context.raw.emptyEnvmap;
+		world._.envmap = Context.raw.showEnvmap ? Context.raw.savedEnvmap : Context.raw.emptyEnvmap;
 		Context.raw.ddirty = 1;
 
 		History.reset();

+ 2 - 2
base/Sources/UIFiles.ts

@@ -167,7 +167,7 @@ class UIFiles {
 						let filesAll = File.readDirectory(handle.text);
 						let iconFile = f.substr(0, f.lastIndexOf(".")) + "_icon.jpg";
 						if (filesAll.indexOf(iconFile) >= 0) {
-							let empty = render_path_render_targets.get("empty_black").image;
+							let empty = render_path_render_targets.get("empty_black")._image;
 							UIFiles.iconMap.set(handle.text + Path.sep + f, empty);
 							File.cacheCloud(handle.text + Path.sep + iconFile, (abs: string) => {
 								if (abs != null) {
@@ -277,7 +277,7 @@ class UIFiles {
 					let shandle = handle.text + Path.sep + f;
 					icon = UIFiles.iconMap.get(shandle);
 					if (icon == null) {
-						let empty = render_path_render_targets.get("empty_black").image;
+						let empty = render_path_render_targets.get("empty_black")._image;
 						UIFiles.iconMap.set(shandle, empty);
 						let image: image_t = data_get_image(shandle);
 						app_notify_on_init(() => {

+ 2 - 2
base/Sources/UIHeader.ts

@@ -40,7 +40,7 @@ class UIHeader {
 		if (Context.raw.tool == WorkspaceTool.ToolColorId) {
 			zui_text(tr("Picked Color"));
 			if (Context.raw.colorIdPicked) {
-				zui_image(render_path_render_targets.get("texpaint_colorid").image, 0xffffffff, 64);
+				zui_image(render_path_render_targets.get("texpaint_colorid")._image, 0xffffffff, 64);
 			}
 			ui.enabled = Context.raw.colorIdPicked;
 			if (zui_button(tr("Clear"))) {
@@ -83,7 +83,7 @@ class UIHeader {
 					if (const_data_screen_aligned_vb == null) const_data_create_screen_aligned_data();
 					g4_begin(m.texpaint);
 					g4_set_pipeline(Base.pipeColorIdToMask);
-					g4_set_tex(Base.texpaintColorId,render_path_render_targets.get("texpaint_colorid").image);
+					g4_set_tex(Base.texpaintColorId,render_path_render_targets.get("texpaint_colorid")._image);
 					g4_set_tex(Base.texColorId, Project.getImage(Project.assets[Context.raw.colorIdHandle.position]));
 					g4_set_vertex_buffer(const_data_screen_aligned_vb);
 					g4_set_index_buffer(const_data_screen_aligned_ib);

+ 1 - 1
base/Sources/UIToolbar.ts

@@ -124,7 +124,7 @@ class UIToolbar {
 
 				///if is_paint
 				if (i == WorkspaceTool.ToolColorId && Context.raw.colorIdPicked) {
-					g2_draw_scaled_sub_image(render_path_render_targets.get("texpaint_colorid").image, 0, 0, 1, 1, 0, _y + 1.5 * zui_SCALE(ui), 5 * zui_SCALE(ui), 34 * zui_SCALE(ui));
+					g2_draw_scaled_sub_image(render_path_render_targets.get("texpaint_colorid")._image, 0, 0, 1, 1, 0, _y + 1.5 * zui_SCALE(ui), 5 * zui_SCALE(ui), 34 * zui_SCALE(ui));
 				}
 				///end
 

+ 1 - 1
base/Sources/UIView2D.ts

@@ -231,7 +231,7 @@ class UIView2D {
 					let x = UIView2D.ui.input_x - tx - UIView2D.wx;
 					let y = UIView2D.ui.input_y - ty - UIView2D.wy;
 					Base.notifyOnNextFrame(() => {
-						let texpaint_picker = render_path_render_targets.get("texpaint_picker").image;
+						let texpaint_picker = render_path_render_targets.get("texpaint_picker")._image;
 						g2_begin(texpaint_picker);
 						g2_draw_scaled_image(tex, -x, -y, tw, th);
 						g2_end();

+ 11 - 11
base/Sources/UniformsExt.ts

@@ -157,7 +157,7 @@ class UniformsExt {
 			case "_gbufferSize": {
 				vec4_set(UniformsExt.vec, 0, 0, 0);
 				let gbuffer2 = render_path_render_targets.get("gbuffer2");
-				vec4_set(UniformsExt.vec, gbuffer2.image.width, gbuffer2.image.height, 0);
+				vec4_set(UniformsExt.vec, gbuffer2._image.width, gbuffer2._image.height, 0);
 				return UniformsExt.vec;
 			}
 			case "_cloneDelta": {
@@ -341,7 +341,7 @@ class UniformsExt {
 			case "_texpaint_undo": {
 				///if (is_paint || is_sculpt)
 				let i = History.undoI - 1 < 0 ? Config.raw.undo_steps - 1 : History.undoI - 1;
-				return render_path_render_targets.get("texpaint_undo" + i).image;
+				return render_path_render_targets.get("texpaint_undo" + i)._image;
 				///end
 
 				///if is_lab
@@ -351,7 +351,7 @@ class UniformsExt {
 			case "_texpaint_nor_undo": {
 				///if (is_paint || is_sculpt)
 				let i = History.undoI - 1 < 0 ? Config.raw.undo_steps - 1 : History.undoI - 1;
-				return render_path_render_targets.get("texpaint_nor_undo" + i).image;
+				return render_path_render_targets.get("texpaint_nor_undo" + i)._image;
 				///end
 
 				///if is_lab
@@ -361,7 +361,7 @@ class UniformsExt {
 			case "_texpaint_pack_undo": {
 				///if (is_paint || is_sculpt)
 				let i = History.undoI - 1 < 0 ? Config.raw.undo_steps - 1 : History.undoI - 1;
-				return render_path_render_targets.get("texpaint_pack_undo" + i).image;
+				return render_path_render_targets.get("texpaint_pack_undo" + i)._image;
 				///end
 
 				///if is_lab
@@ -380,7 +380,7 @@ class UniformsExt {
 
 			///if (is_paint || is_sculpt)
 			case "_texcolorid": {
-				if (Project.assets.length == 0) return render_path_render_targets.get("empty_white").image;
+				if (Project.assets.length == 0) return render_path_render_targets.get("empty_white")._image;
 				else return Project.getImage(Project.assets[Context.raw.colorIdHandle.position]);
 			}
 			case "_textexttool": { // Opacity map for text
@@ -393,7 +393,7 @@ class UniformsExt {
 				return Context.raw.brushStencilImage;
 			}
 			case "_texparticle": {
-				return render_path_render_targets.get("texparticle").image;
+				return render_path_render_targets.get("texparticle")._image;
 			}
 			///end
 
@@ -421,7 +421,7 @@ class UniformsExt {
 					UtilUV.cacheUVIslandMap();
 				}
 				app_notify_on_init(_init);
-				return UtilUV.uvislandmapCached ? UtilUV.uvislandmap :render_path_render_targets.get("empty_black").image;
+				return UtilUV.uvislandmapCached ? UtilUV.uvislandmap :render_path_render_targets.get("empty_black")._image;
 			}
 			case "_texdilatemap": {
 				return UtilUV.dilatemap;
@@ -431,7 +431,7 @@ class UniformsExt {
 
 		if (link.startsWith("_texpaint_pack_vert")) {
 			let tid = link.substr(link.length - 1);
-			return render_path_render_targets.get("texpaint_pack" + tid).image;
+			return render_path_render_targets.get("texpaint_pack" + tid)._image;
 		}
 
 		if (link.startsWith("_texpaint_vert")) {
@@ -478,15 +478,15 @@ class UniformsExt {
 		///if (is_paint || is_sculpt)
 		if (link.startsWith("_texblur_")) {
 			let id = link.substr(9);
-			return Context.raw.nodePreviews != null ? Context.raw.nodePreviews.get(id) :render_path_render_targets.get("empty_black").image;
+			return Context.raw.nodePreviews != null ? Context.raw.nodePreviews.get(id) :render_path_render_targets.get("empty_black")._image;
 		}
 		if (link.startsWith("_texwarp_")) {
 			let id = link.substr(9);
-			return Context.raw.nodePreviews != null ? Context.raw.nodePreviews.get(id) :render_path_render_targets.get("empty_black").image;
+			return Context.raw.nodePreviews != null ? Context.raw.nodePreviews.get(id) :render_path_render_targets.get("empty_black")._image;
 		}
 		if (link.startsWith("_texbake_")) {
 			let id = link.substr(9);
-			return Context.raw.nodePreviews != null ? Context.raw.nodePreviews.get(id) :render_path_render_targets.get("empty_black").image;
+			return Context.raw.nodePreviews != null ? Context.raw.nodePreviews.get(id) :render_path_render_targets.get("empty_black")._image;
 		}
 		///end
 

+ 16 - 16
base/Sources/UtilMesh.ts

@@ -119,8 +119,8 @@ class UtilMesh {
 			}
 
 			let g = o.data;
-			let l = g4_vertex_struct_byte_size(g._struct) / 2;
-			let vertices = g4_vertex_buffer_lock(g._vertex_buffer); // posnortex
+			let l = g4_vertex_struct_byte_size(g._.structure) / 2;
+			let vertices = g4_vertex_buffer_lock(g._.vertex_buffer); // posnortex
 			for (let i = 0; i < Math.floor(vertices.byteLength / 2 / l); ++i) {
 				vertices.setInt16((i * l    ) * 2, vas[0].values[i * 4    ], true);
 				vertices.setInt16((i * l + 1) * 2, vas[0].values[i * 4 + 1], true);
@@ -129,7 +129,7 @@ class UtilMesh {
 				vertices.setInt16((i * l + 4) * 2, vas[1].values[i * 2    ], true);
 				vertices.setInt16((i * l + 5) * 2, vas[1].values[i * 2 + 1], true);
 			}
-			g4_vertex_buffer_unlock(g._vertex_buffer);
+			g4_vertex_buffer_unlock(g._.vertex_buffer);
 		}
 
 		UtilMesh.removeMergedMesh();
@@ -143,8 +143,8 @@ class UtilMesh {
 			let va0 = vas[0].values;
 			let va1 = vas[1].values;
 			let g = o.data;
-			let l = g4_vertex_struct_byte_size(g._struct) / 2;
-			let vertices = g4_vertex_buffer_lock(g._vertex_buffer); // posnortex
+			let l = g4_vertex_struct_byte_size(g._.structure) / 2;
+			let vertices = g4_vertex_buffer_lock(g._.vertex_buffer); // posnortex
 			for (let i = 0; i < Math.floor(vertices.byteLength / 2 / l); ++i) {
 				va0[i * 4 + 3] = -va0[i * 4 + 3];
 				va1[i * 2] = -va1[i * 2];
@@ -153,7 +153,7 @@ class UtilMesh {
 				vertices.setInt16((i * l + 4) * 2, -vertices.getInt16((i * l + 4) * 2, true), true);
 				vertices.setInt16((i * l + 5) * 2, -vertices.getInt16((i * l + 5) * 2, true), true);
 			}
-			g4_vertex_buffer_unlock(g._vertex_buffer);
+			g4_vertex_buffer_unlock(g._.vertex_buffer);
 		}
 
 		///if (krom_direct3d12 || krom_vulkan || krom_metal)
@@ -170,9 +170,9 @@ class UtilMesh {
 		let objects = Project.paintObjects;
 		for (let o of objects) {
 			let g = o.data;
-			let l = g4_vertex_struct_byte_size(g._struct) / 2;
-			let inda = g._indices[0];
-			let vertices = g4_vertex_buffer_lock(g._vertex_buffer); // posnortex
+			let l = g4_vertex_struct_byte_size(g._.structure) / 2;
+			let inda = g._.indices[0];
+			let vertices = g4_vertex_buffer_lock(g._.vertex_buffer); // posnortex
 			for (let i = 0; i < Math.floor(inda.length / 3); ++i) {
 				let i1 = inda[i * 3    ];
 				let i2 = inda[i * 3 + 1];
@@ -239,7 +239,7 @@ class UtilMesh {
 					}
 				}
 			}
-			g4_vertex_buffer_unlock(g._vertex_buffer);
+			g4_vertex_buffer_unlock(g._.vertex_buffer);
 
 			let va0 = o.data.vertex_arrays[0].values;
 			let va1 = o.data.vertex_arrays[1].values;
@@ -305,14 +305,14 @@ class UtilMesh {
 				va[i * 4 + 2] = Math.floor((va[i * 4 + 2] * sc - dz) / maxScale * 32767);
 			}
 
-			let l = g4_vertex_struct_byte_size(g._struct) / 2;
-			let vertices = g4_vertex_buffer_lock(g._vertex_buffer); // posnortex
+			let l = g4_vertex_struct_byte_size(g._.structure) / 2;
+			let vertices = g4_vertex_buffer_lock(g._.vertex_buffer); // posnortex
 			for (let i = 0; i < Math.floor(vertices.byteLength / 2 / l); ++i) {
 				vertices.setInt16((i * l    ) * 2, va[i * 4    ], true);
 				vertices.setInt16((i * l + 1) * 2, va[i * 4 + 1], true);
 				vertices.setInt16((i * l + 2) * 2, va[i * 4 + 2], true);
 			}
-			g4_vertex_buffer_unlock(g._vertex_buffer);
+			g4_vertex_buffer_unlock(g._.vertex_buffer);
 		}
 
 		UtilMesh.mergeMesh();
@@ -324,8 +324,8 @@ class UtilMesh {
 		let res = texpaint_pack.width;
 		let o = Project.paintObjects[0];
 		let g = o.data;
-		let l = g4_vertex_struct_byte_size(g._struct) / 2;
-		let vertices = g4_vertex_buffer_lock(g._vertex_buffer); // posnortex
+		let l = g4_vertex_struct_byte_size(g._.structure) / 2;
+		let vertices = g4_vertex_buffer_lock(g._.vertex_buffer); // posnortex
 		for (let i = 0; i < Math.floor(vertices.byteLength / 2 / l); ++i) {
 			let x = Math.floor(vertices.getInt16((i * l + 6) * 2, true) / 32767 * res);
 			let y = Math.floor(vertices.getInt16((i * l + 7) * 2, true) / 32767 * res);
@@ -336,7 +336,7 @@ class UtilMesh {
 			vertices.setInt16((i * l + 1) * 2, vertices.getInt16((i * l + 1) * 2, true) - Math.floor(vertices.getInt16((i * l + 5) * 2, true) * h), true);
 			vertices.setInt16((i * l + 2) * 2, vertices.getInt16((i * l + 2) * 2, true) - Math.floor(vertices.getInt16((i * l + 3) * 2, true) * h), true);
 		}
-		g4_vertex_buffer_unlock(g._vertex_buffer);
+		g4_vertex_buffer_unlock(g._.vertex_buffer);
 
 		let va0 = o.data.vertex_arrays[0].values;
 		for (let i = 0; i < Math.floor(vertices.byteLength / 4 / l); ++i) {

+ 6 - 3
base/Sources/UtilParticle.ts

@@ -60,10 +60,13 @@ class UtilParticle {
 			if (obj.name == ".Sphere") {
 				let particle: obj_t = JSON.parse(JSON.stringify(obj));
 				particle.name = ".Particle";
-				particle.is_particle = true;
+				if (particle.particles == null) {
+					particle.particles = {};
+				}
+				particle.particles.is_particle = true;
 				particle.material_refs = ["MaterialParticle"];
 				_scene_raw.objects.push(particle);
-				for (let i = 0; i < 16; ++i) particle.transform.values[i] *= 0.01;
+				for (let i = 0; i < 16; ++i) particle.transform[i] *= 0.01;
 				break;
 			}
 		}
@@ -72,7 +75,7 @@ class UtilParticle {
 		let mo: mesh_object_t = o.ext;
 		mo.base.name = ".ParticleEmitter";
 		mo.base.raw = JSON.parse(JSON.stringify(mo.base.raw));
-		mo.base.raw.particle_refs = particle_refs;
+		mo.base.raw.particles.refs = particle_refs;
 		///if arm_particles
 		mesh_object_setup_particle_system(mo, "Scene", particle_refs[0]);
 		///end

+ 7 - 7
base/Sources/UtilRender.ts

@@ -41,7 +41,7 @@ class UtilRender {
 		let _brushNodesScale = Context.raw.brushNodesScale;
 		Context.raw.brushNodesScale = 1.0;
 
-		scene_world._envmap = Context.raw.previewEnvmap;
+		scene_world._.envmap = Context.raw.previewEnvmap;
 		// No resize
 		_render_path_last_w = UtilRender.materialPreviewSize;
 		_render_path_last_h = UtilRender.materialPreviewSize;
@@ -73,7 +73,7 @@ class UtilRender {
 		Context.raw.envmapAngle = _envmapAngle;
 		Context.raw.brushScale = _brushScale;
 		Context.raw.brushNodesScale = _brushNodesScale;
-		scene_world._envmap = Context.raw.showEnvmap ? Context.raw.savedEnvmap : Context.raw.emptyEnvmap;
+		scene_world._.envmap = Context.raw.showEnvmap ? Context.raw.savedEnvmap : Context.raw.emptyEnvmap;
 		MakeMaterial.parseMeshMaterial();
 		Context.raw.ddirty = 0;
 	}
@@ -106,7 +106,7 @@ class UtilRender {
 		Viewport.updateCameraType(CameraType.CameraPerspective);
 		let light = scene_lights[0];
 		light.base.visible = false;
-		scene_world._envmap = Context.raw.previewEnvmap;
+		scene_world._.envmap = Context.raw.previewEnvmap;
 
 		// No resize
 		_render_path_last_w = UtilRender.decalPreviewSize;
@@ -136,7 +136,7 @@ class UtilRender {
 		camera_object_build_mat(scene_camera);
 		light = scene_lights[0];
 		light.base.visible = true;
-		scene_world._envmap = Context.raw.showEnvmap ? Context.raw.savedEnvmap : Context.raw.emptyEnvmap;
+		scene_world._.envmap = Context.raw.showEnvmap ? Context.raw.savedEnvmap : Context.raw.emptyEnvmap;
 
 		MakeMaterial.parseMeshMaterial();
 		Context.raw.ddirty = 1; // Refresh depth for decal paint
@@ -351,8 +351,8 @@ class UtilRender {
 		g2_end();
 
 		// Scale image preview down to to icon
-		render_path_render_targets.get("texpreview").image = Context.raw.brush.image;
-		render_path_render_targets.get("texpreview_icon").image = Context.raw.brush.imageIcon;
+		render_path_render_targets.get("texpreview")._image = Context.raw.brush.image;
+		render_path_render_targets.get("texpreview_icon")._image = Context.raw.brush.imageIcon;
 		render_path_set_target("texpreview_icon");
 		render_path_bind_target("texpreview", "tex");
 		render_path_draw_shader("shader_datas/supersample_resolve/supersample_resolve");
@@ -376,7 +376,7 @@ class UtilRender {
 		transform_build_matrix(Context.raw.paintObject.base.transform);
 
 		g4_begin(image);
-		g4_set_pipeline(res.scon._pipe_state);
+		g4_set_pipeline(res.scon._.pipe_state);
 		uniforms_set_context_consts(res.scon, [""]);
 		uniforms_set_obj_consts(res.scon, Context.raw.paintObject.base);
 		uniforms_set_material_consts(res.scon, res.mcon);

+ 2 - 2
base/Sources/UtilUV.ts

@@ -134,9 +134,9 @@ class UtilUV {
 		///if (krom_metal || krom_vulkan)
 		g4_set_vertex_buffer(mesh_data_get(geom, [{name: "tex", data: "short2norm"}]));
 		///else
-		g4_set_vertex_buffer(geom._vertex_buffer);
+		g4_set_vertex_buffer(geom._.vertex_buffer);
 		///end
-		g4_set_index_buffer(geom._index_buffers[0]);
+		g4_set_index_buffer(geom._.index_buffers[0]);
 		g4_draw();
 		g4_end();
 		UtilUV.dilatemapCached = true;

+ 1 - 1
base/Sources/Viewport.ts

@@ -23,7 +23,7 @@ class Viewport {
 		let cam = scene_camera;
 		for (let o of _scene_raw.objects) {
 			if (o.type == "camera_object") {
-				mat4_set_from_f32_array(cam.base.transform.local, o.transform.values);
+				mat4_set_from_f32_array(cam.base.transform.local, o.transform);
 				transform_decompose(cam.base.transform);
 				if (Context.raw.fovHandle != null) Context.raw.fovHandle.value = cam.data.fov = Base.defaultFov;
 				Context.raw.camHandle.position = 0;