paint: add camera pivot to config

This commit is contained in:
luboslenco
2026-03-31 12:39:41 +02:00
parent 0cfd97a290
commit 063cc754b5
9 changed files with 35 additions and 11 deletions
+3 -3
View File
@@ -582,9 +582,8 @@ void base_render(void *_) {
if (context_raw->frame == 2) {
make_material_parse_mesh_material();
make_material_parse_paint_material(true);
context_raw->ddirty = 0;
// Mouse coords not updated during drag
context_raw->ddirty = 0;
context_raw->camera_pivot = config_raw->camera_pivot;
context_raw->camera_controls = config_raw->camera_controls;
}
else if (context_raw->frame == 3) {
@@ -1806,6 +1805,7 @@ void ui_base_render(void *_) {
draw_image(img, base_view3d_w() / 2.0 - img->width / 2.0, base_h() / 2.0 - img->height / 2.0);
draw_end();
}
ui_begin(ui);
ui_toolbar_render_ui();
ui_menubar_render_ui();
+10
View File
@@ -338,6 +338,16 @@ void box_preferences_usage_tab() {
ui_tooltip(tr("Dilate painted textures to prevent seams"));
}
ui_handle_t *h_camera_pivot = ui_handle(__ID__);
h_camera_pivot->i = config_raw->camera_pivot;
string_t_array_t *camera_pivot_combo = any_array_create_from_raw(
(void *[]){
tr("Cursor"),
tr("Center"),
},
2);
config_raw->camera_pivot = ui_combo(h_camera_pivot, camera_pivot_combo, tr("Default Camera Pivot"), true, UI_ALIGN_LEFT, true);
ui_handle_t *h_camera_controls = ui_handle(__ID__);
h_camera_controls->i = config_raw->camera_controls;
string_t_array_t *camera_controls_combo = any_array_create_from_raw(
+2
View File
@@ -92,6 +92,7 @@ void config_save() {
else {
json_encode_null("layout_tabs");
}
json_encode_i32("camera_pivot", config_raw->camera_pivot);
json_encode_i32("camera_controls", config_raw->camera_controls);
json_encode_string("server", config_raw->server);
json_encode_i32("viewport_mode", config_raw->viewport_mode);
@@ -207,6 +208,7 @@ void config_init() {
config_raw->zoom_direction = ZOOM_DIRECTION_VERTICAL;
config_raw->displace_strength = 0.0;
config_raw->wrap_mouse = false;
config_raw->camera_pivot = CAMERA_PIVOT_CURSOR;
config_raw->camera_controls = CAMERA_CONTROLS_ORBIT;
config_raw->layer_res = TEXTURE_RES_RES2048;
#if defined(IRON_ANDROID) || defined(IRON_IOS)
+1
View File
@@ -56,6 +56,7 @@ context_t *context_create() {
c->fov_handle = ui_handle_create();
c->texture_export_path = "";
c->last_status_position = 0;
c->camera_pivot = CAMERA_PIVOT_CURSOR;
c->camera_controls = CAMERA_CONTROLS_ORBIT;
c->pen_painting_only = false; // Reject painting with finger when using pen
c->layer_preview_dirty = true;
+8 -3
View File
@@ -111,10 +111,10 @@ typedef enum {
} export_destination_t;
typedef enum {
PLAYER_TARGET_WEB = 0,
PLAYER_TARGET_WEB = 0,
PLAYER_TARGET_WINDOWS = 1,
PLAYER_TARGET_LINUX = 2,
PLAYER_TARGET_MACOS = 3,
PLAYER_TARGET_LINUX = 2,
PLAYER_TARGET_MACOS = 3,
} player_target_t;
typedef enum {
@@ -167,6 +167,11 @@ typedef enum {
CAMERA_CONTROLS_FLY = 2,
} camera_controls_t;
typedef enum {
CAMERA_PIVOT_CURSOR = 0,
CAMERA_PIVOT_CAMERA_CENTER = 1,
} camera_pivot_t;
typedef enum {
CAMERA_TYPE_PERSPECTIVE = 0,
CAMERA_TYPE_ORTHOGRAPHIC = 1,
+1 -1
View File
@@ -503,7 +503,7 @@ node_shader_context_t *make_paint_run(material_t *data, material_context_t *matc
}
else {
node_shader_write_frag(kong, string("output[0] = float4(%s, str + sample_undo.a * (1.0 - str));",
make_material_blend_mode(kong, context_raw->brush_blending, "sample_undo.rgb", "basecol", "opacity")));
make_material_blend_mode(kong, context_raw->brush_blending, "sample_undo.rgb", "basecol", "str")));
}
}
node_shader_write_frag(kong, "output[1] = float4(nortan, matid);");
+3 -1
View File
@@ -113,7 +113,8 @@ typedef struct config {
bool splash_screen;
struct i32_array *layout; // Sizes
struct i32_array *layout_tabs; // Active tabs
i32 camera_controls; // Orbit, rotate
i32 camera_pivot; // Cursor, camera center
i32 camera_controls; // Orbit, rotate, fly
char *server;
i32 viewport_mode;
i32 pathtrace_mode;
@@ -260,6 +261,7 @@ typedef struct context {
struct ui_handle *fov_handle;
char *texture_export_path;
i32 last_status_position;
camera_pivot_t camera_pivot;
camera_controls_t camera_controls;
bool pen_painting_only;
struct slot_material *material;
+4
View File
@@ -25,6 +25,10 @@ void ui_header_render_ui() {
i32 nodesw = (ui_nodes_show || ui_view2d_show) ? config_raw->layout->buffer[LAYOUT_SIZE_NODES_W] : 0;
i32 ww = iron_window_width() - ui_toolbar_w(true) - config_raw->layout->buffer[LAYOUT_SIZE_SIDEBAR_W] - nodesw;
if (ui->is_typing) {
ui_header_handle->redraws = 2;
}
if (ui_window(ui_header_handle, base_x(), ui_header_h, ww, ui_header_h, false)) {
ui->_y += 2;
ui_header_draw_tool_properties();
+3 -3
View File
@@ -761,10 +761,10 @@ void ui_menubar_draw_category_items() {
ui_handle_t *h = ui_handle(__ID__);
string_t_array_t *pivot_center_items = any_array_create_from_raw(
(void *[]){
tr("Camera Center"), // tr("Paint Stroke")
tr("Cursor"), tr("Center"),
},
1);
ui_inline_radio(h, pivot_center_items, UI_ALIGN_LEFT);
2);
context_raw->camera_pivot = ui_inline_radio(h, pivot_center_items, UI_ALIGN_LEFT);
ui_menu_separator();
ui_menu_align();