| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
- type brush_output_node_t = {
- base?: logic_node_t;
- raw?: ui_node_t;
- };
- function brush_output_node_create_ext(n: brush_output_node_t) {
- context_raw.brush_output_node_inst = n;
- }
- function brush_output_node_parse_inputs(self: brush_output_node_t) {
- let last_mask: gpu_texture_t = context_raw.brush_mask_image;
- let last_stencil: gpu_texture_t = context_raw.brush_stencil_image;
- let input0: logic_node_value_t = logic_node_input_get(self.base.inputs[0]);
- let input1: logic_node_value_t = logic_node_input_get(self.base.inputs[1]);
- let input2: logic_node_value_t = logic_node_input_get(self.base.inputs[2]);
- let input3: logic_node_value_t = logic_node_input_get(self.base.inputs[3]);
- let input4: logic_node_value_t = logic_node_input_get(self.base.inputs[4]);
- let input5: logic_node_value_t = logic_node_input_get(self.base.inputs[5]);
- let input6: logic_node_value_t = logic_node_input_get(self.base.inputs[6]);
- context_raw.paint_vec = input0._vec4;
- context_raw.brush_nodes_radius = input1._f32;
- context_raw.brush_nodes_scale = input2._f32;
- context_raw.brush_nodes_angle = input3._f32;
- let opac: logic_node_value_t = input4; // Float or texture name
- if (opac == null) {
- opac = { _f32: 1.0 };
- }
- if (opac._str != null) { // string
- context_raw.brush_mask_image_is_alpha = ends_with(opac._str, ".a");
- opac._str = substring(opac._str, 0, string_last_index_of(opac._str, "."));
- context_raw.brush_nodes_opacity = 1.0;
- let index: i32 = array_index_of(project_asset_names, opac._str);
- let asset: asset_t = project_assets[index];
- context_raw.brush_mask_image = project_get_image(asset);
- }
- else {
- context_raw.brush_nodes_opacity = opac._f32;
- context_raw.brush_mask_image = null;
- }
- context_raw.brush_nodes_hardness = input5._f32;
- let stencil: logic_node_value_t = input6; // Float or texture name
- if (stencil == null) {
- stencil = { _f32: 1.0 };
- }
- if (stencil._str != null) { // string
- context_raw.brush_stencil_image_is_alpha = ends_with(stencil._str, ".a");
- stencil._str = substring(stencil._str, 0, string_last_index_of(stencil._str, "."));
- let index: i32 = array_index_of(project_asset_names, stencil._str);
- let asset: asset_t = project_assets[index];
- context_raw.brush_stencil_image = project_get_image(asset);
- }
- else {
- context_raw.brush_stencil_image = null;
- }
- if (last_mask != context_raw.brush_mask_image ||
- last_stencil != context_raw.brush_stencil_image) {
- make_material_parse_paint_material();
- }
- context_raw.brush_directional = self.raw.buttons[0].default_value[0] > 0.0;
- }
- function brush_output_node_run(self: brush_output_node_t, from: i32) {
- let left: f32 = 0.0;
- let right: f32 = 1.0;
- let top: f32 = 0.0;
- let bottom: f32 = 1.0;
- if (context_raw.paint2d) {
- left = 1.0;
- right = (context_raw.split_view ? 2.0 : 1.0) + ui_view2d_ww / base_w();
- }
- // Do not paint over floating toolbar
- if (context_is_floating_toolbar()) {
- let w: i32 = ui_toolbar_x() + ui_toolbar_w();
- left += w / sys_w();
- top += w / sys_h();
- }
- // First time init
- if (context_raw.last_paint_x < 0 || context_raw.last_paint_y < 0) {
- context_raw.last_paint_vec_x = context_raw.paint_vec.x;
- context_raw.last_paint_vec_y = context_raw.paint_vec.y;
- }
- // Paint bounds
- if (context_raw.paint_vec.x < left ||
- context_raw.paint_vec.x > right ||
- context_raw.paint_vec.y < top ||
- context_raw.paint_vec.y > bottom) {
- return;
- }
- // Do not paint over fill layer
- 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 (fill_layer) {
- return;
- }
- // Do not paint over groups
- if (slot_layer_is_group(context_raw.layer)) {
- return;
- }
- if (!slot_layer_is_visible(context_raw.layer) && !context_raw.paint2d) {
- return;
- }
- if (ui_base_ui.is_hovered ||
- base_is_dragging ||
- base_is_resizing ||
- base_is_scrolling() ||
- base_is_combo_selected()) {
- return;
- }
- brush_output_paint(self);
- }
- function brush_output_paint(self: brush_output_node_t) {
- let down: bool = mouse_down() || pen_down();
- // Set color pick
- if (down && context_raw.tool == workspace_tool_t.COLORID && project_assets.length > 0) {
- context_raw.colorid_picked = true;
- ui_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;
- if (down && (same_spot || lazy)) {
- context_raw.painted++;
- }
- else {
- context_raw.painted = 0;
- }
- 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.painted == 0) {
- brush_output_node_parse_inputs(self);
- }
- if (context_raw.painted <= 1) {
- context_raw.pdirty = 1;
- context_raw.rdirty = 2;
- }
- }
- // let brush_output_node_def: node_t = {
- // id: 0,
- // name: _tr("Brush Output"),
- // type: "brush_output_node",
- // x: 0,
- // y: 0,
- // color: 0xff4982a0,
- // inputs: [
- // {
- // id: 0,
- // node_id: 0,
- // name: _tr("Position"),
- // type: "VECTOR",
- // color: 0xff63c763,
- // default_value: f32_array_create_xyz(0.0, 0.0, 0.0),
- // min: 0.0,
- // max: 1.0,
- // precision: 100,
- // display: 0
- // },
- // {
- // id: 0,
- // node_id: 0,
- // name: _tr("Radius"),
- // type: "VALUE",
- // color: 0xffa1a1a1,
- // default_value: f32_array_create_x(1.0),
- // min: 0.0,
- // max: 1.0,
- // precision: 100,
- // display: 0
- // },
- // {
- // id: 0,
- // node_id: 0,
- // name: _tr("Scale"),
- // type: "VALUE",
- // color: 0xffa1a1a1,
- // default_value: f32_array_create_x(1.0),
- // min: 0.0,
- // max: 1.0,
- // precision: 100,
- // display: 0
- // },
- // {
- // id: 0,
- // node_id: 0,
- // name: _tr("Angle"),
- // type: "VALUE",
- // color: 0xffa1a1a1,
- // default_value: f32_array_create_x(0.0),
- // min: 0.0,
- // max: 1.0,
- // precision: 100,
- // display: 0
- // },
- // {
- // id: 0,
- // node_id: 0,
- // name: _tr("Opacity"),
- // type: "VALUE",
- // color: 0xffa1a1a1,
- // default_value: f32_array_create_x(1.0),
- // min: 0.0,
- // max: 1.0,
- // precision: 100,
- // display: 0
- // },
- // {
- // id: 0,
- // node_id: 0,
- // name: _tr("Hardness"),
- // type: "VALUE",
- // color: 0xffa1a1a1,
- // default_value: f32_array_create_x(1.0),
- // min: 0.0,
- // max: 1.0,
- // precision: 100,
- // display: 0
- // },
- // {
- // id: 0,
- // node_id: 0,
- // name: _tr("Stencil"),
- // type: "VALUE",
- // color: 0xffa1a1a1,
- // default_value: f32_array_create_x(1.0),
- // min: 0.0,
- // max: 1.0,
- // precision: 100,
- // display: 0
- // }
- // ],
- // outputs: [],
- // buttons: [
- // {
- // name: _tr("Directional"),
- // type: "BOOL",
- // output: 0,
- // default_value: f32_array_create_x(0),
- // data: null,
- // min: 0.0,
- // max: 1.0,
- // precision: 100,
- // height: 0
- // }
- // ],
- // width: 0
- // };
|