palette picker
This commit is contained in:
parent
97fe391cda
commit
07c41a75fc
@ -24,139 +24,4 @@ VK_KHR_deferred_host_operations
|
|||||||
VK_KHR_acceleration_structure
|
VK_KHR_acceleration_structure
|
||||||
VK_KHR_ray_query
|
VK_KHR_ray_query
|
||||||
|
|
||||||
BLAS Compaction: 2.4MB -> 0.8MB (1.6MB saved, 66.1% smaller)
|
BLAS Compaction: 2.6MB -> 0.9MB (1.7MB saved, 66.1% smaller)
|
||||||
_______________
|
|
||||||
Vulkan Version:
|
|
||||||
- available: 1.4.309
|
|
||||||
- requesting: 1.3.0
|
|
||||||
______________________
|
|
||||||
Used Instance Layers :
|
|
||||||
VK_LAYER_KHRONOS_validation
|
|
||||||
|
|
||||||
Used Instance Extensions :
|
|
||||||
____________________
|
|
||||||
Devices : 1
|
|
||||||
0: AMD Radeon RX 6950 XT
|
|
||||||
- Compatible
|
|
||||||
Compatible physical devices found : 1
|
|
||||||
Using Device:
|
|
||||||
- Device Name : AMD Radeon RX 6950 XT
|
|
||||||
- Vendor : AMD
|
|
||||||
- Driver Version : 2.0.341
|
|
||||||
- API Version : 1.4.308
|
|
||||||
- Device Type : Discrete GPU
|
|
||||||
________________________
|
|
||||||
Used Device Extensions :
|
|
||||||
VK_KHR_deferred_host_operations
|
|
||||||
VK_KHR_acceleration_structure
|
|
||||||
VK_KHR_ray_query
|
|
||||||
|
|
||||||
BLAS Compaction: 2.4MB -> 0.8MB (1.6MB saved, 66.1% smaller)
|
|
||||||
_______________
|
|
||||||
Vulkan Version:
|
|
||||||
- available: 1.4.309
|
|
||||||
- requesting: 1.3.0
|
|
||||||
______________________
|
|
||||||
Used Instance Layers :
|
|
||||||
VK_LAYER_KHRONOS_validation
|
|
||||||
|
|
||||||
Used Instance Extensions :
|
|
||||||
____________________
|
|
||||||
Devices : 1
|
|
||||||
0: AMD Radeon RX 6950 XT
|
|
||||||
- Compatible
|
|
||||||
Compatible physical devices found : 1
|
|
||||||
Using Device:
|
|
||||||
- Device Name : AMD Radeon RX 6950 XT
|
|
||||||
- Vendor : AMD
|
|
||||||
- Driver Version : 2.0.341
|
|
||||||
- API Version : 1.4.308
|
|
||||||
- Device Type : Discrete GPU
|
|
||||||
________________________
|
|
||||||
Used Device Extensions :
|
|
||||||
VK_KHR_deferred_host_operations
|
|
||||||
VK_KHR_acceleration_structure
|
|
||||||
VK_KHR_ray_query
|
|
||||||
|
|
||||||
BLAS Compaction: 2.4MB -> 0.8MB (1.6MB saved, 66.1% smaller)
|
|
||||||
_______________
|
|
||||||
Vulkan Version:
|
|
||||||
- available: 1.4.309
|
|
||||||
- requesting: 1.3.0
|
|
||||||
______________________
|
|
||||||
Used Instance Layers :
|
|
||||||
VK_LAYER_KHRONOS_validation
|
|
||||||
|
|
||||||
Used Instance Extensions :
|
|
||||||
____________________
|
|
||||||
Devices : 1
|
|
||||||
0: AMD Radeon RX 6950 XT
|
|
||||||
- Compatible
|
|
||||||
Compatible physical devices found : 1
|
|
||||||
Using Device:
|
|
||||||
- Device Name : AMD Radeon RX 6950 XT
|
|
||||||
- Vendor : AMD
|
|
||||||
- Driver Version : 2.0.341
|
|
||||||
- API Version : 1.4.308
|
|
||||||
- Device Type : Discrete GPU
|
|
||||||
________________________
|
|
||||||
Used Device Extensions :
|
|
||||||
VK_KHR_deferred_host_operations
|
|
||||||
VK_KHR_acceleration_structure
|
|
||||||
VK_KHR_ray_query
|
|
||||||
|
|
||||||
BLAS Compaction: 2.4MB -> 0.8MB (1.6MB saved, 66.1% smaller)
|
|
||||||
_______________
|
|
||||||
Vulkan Version:
|
|
||||||
- available: 1.4.309
|
|
||||||
- requesting: 1.3.0
|
|
||||||
______________________
|
|
||||||
Used Instance Layers :
|
|
||||||
VK_LAYER_KHRONOS_validation
|
|
||||||
|
|
||||||
Used Instance Extensions :
|
|
||||||
____________________
|
|
||||||
Devices : 1
|
|
||||||
0: AMD Radeon RX 6950 XT
|
|
||||||
- Compatible
|
|
||||||
Compatible physical devices found : 1
|
|
||||||
Using Device:
|
|
||||||
- Device Name : AMD Radeon RX 6950 XT
|
|
||||||
- Vendor : AMD
|
|
||||||
- Driver Version : 2.0.341
|
|
||||||
- API Version : 1.4.308
|
|
||||||
- Device Type : Discrete GPU
|
|
||||||
________________________
|
|
||||||
Used Device Extensions :
|
|
||||||
VK_KHR_deferred_host_operations
|
|
||||||
VK_KHR_acceleration_structure
|
|
||||||
VK_KHR_ray_query
|
|
||||||
|
|
||||||
BLAS Compaction: 2.4MB -> 0.8MB (1.6MB saved, 66.1% smaller)
|
|
||||||
_______________
|
|
||||||
Vulkan Version:
|
|
||||||
- available: 1.4.309
|
|
||||||
- requesting: 1.3.0
|
|
||||||
______________________
|
|
||||||
Used Instance Layers :
|
|
||||||
VK_LAYER_KHRONOS_validation
|
|
||||||
|
|
||||||
Used Instance Extensions :
|
|
||||||
____________________
|
|
||||||
Devices : 1
|
|
||||||
0: AMD Radeon RX 6950 XT
|
|
||||||
- Compatible
|
|
||||||
Compatible physical devices found : 1
|
|
||||||
Using Device:
|
|
||||||
- Device Name : AMD Radeon RX 6950 XT
|
|
||||||
- Vendor : AMD
|
|
||||||
- Driver Version : 2.0.341
|
|
||||||
- API Version : 1.4.308
|
|
||||||
- Device Type : Discrete GPU
|
|
||||||
________________________
|
|
||||||
Used Device Extensions :
|
|
||||||
VK_KHR_deferred_host_operations
|
|
||||||
VK_KHR_acceleration_structure
|
|
||||||
VK_KHR_ray_query
|
|
||||||
|
|
||||||
BLAS Compaction: 2.4MB -> 0.8MB (1.6MB saved, 66.1% smaller)
|
|
||||||
|
|||||||
@ -328,6 +328,12 @@ add_resources_from_pack :: (pack: *Loaded_Pack) {
|
|||||||
log_info("Loaded % particle definitions from pack", g_emitter_defs.count);
|
log_info("Loaded % particle definitions from pack", g_emitter_defs.count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case "hex";
|
||||||
|
pal : Loaded_Palette;
|
||||||
|
pal.name = sprint("%", name);
|
||||||
|
pal.entries = load_hex_palette_from_memory(v.data);
|
||||||
|
array_add(*g_palettes, pal);
|
||||||
|
log_info("Loaded % colors from hex palette(%)", pal.entries.count, v.name);
|
||||||
case "ttf";
|
case "ttf";
|
||||||
// Load into a font. Add to free list.
|
// Load into a font. Add to free list.
|
||||||
case;
|
case;
|
||||||
|
|||||||
@ -30,6 +30,40 @@ create_string_from_memory :: (data: []u8) -> string {
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
load_hex_palette_from_memory :: (data: []u8) -> [..]Palette_Entry {
|
||||||
|
entries : [..]Palette_Entry;
|
||||||
|
parse_hex_byte :: (s: string) -> (u8, bool) {
|
||||||
|
val : u8 = 0;
|
||||||
|
for i: 0..1 {
|
||||||
|
c := s[i];
|
||||||
|
digit : u8;
|
||||||
|
if c >= #char "0" && c <= #char "9" digit = c - #char "0";
|
||||||
|
else if c >= #char "a" && c <= #char "f" digit = c - #char "a" + 10;
|
||||||
|
else if c >= #char "A" && c <= #char "F" digit = c - #char "A" + 10;
|
||||||
|
else return 0, false;
|
||||||
|
val = val * 16 + digit;
|
||||||
|
}
|
||||||
|
return val, true;
|
||||||
|
}
|
||||||
|
|
||||||
|
s := create_string_from_memory(data);
|
||||||
|
for line: split(s, "\n") {
|
||||||
|
trimmed := trim(line);
|
||||||
|
if trimmed.count != 6 then continue;
|
||||||
|
rb, ok1 := parse_hex_byte(slice(trimmed, 0, 2));
|
||||||
|
gb, ok2 := parse_hex_byte(slice(trimmed, 2, 2));
|
||||||
|
bb, ok3 := parse_hex_byte(slice(trimmed, 4, 2));
|
||||||
|
if !ok1 || !ok2 || !ok3 then continue;
|
||||||
|
entry : Palette_Entry;
|
||||||
|
entry.name = sprint("#%", trimmed);
|
||||||
|
entry.r = cast(float)rb / 255.0;
|
||||||
|
entry.g = cast(float)gb / 255.0;
|
||||||
|
entry.b = cast(float)bb / 255.0;
|
||||||
|
array_add(*entries, entry);
|
||||||
|
}
|
||||||
|
return entries;
|
||||||
|
}
|
||||||
|
|
||||||
load_wav_from_memory :: (data: []u8) -> Audio_Data {
|
load_wav_from_memory :: (data: []u8) -> Audio_Data {
|
||||||
Wav :: #import "Wav_File";
|
Wav :: #import "Wav_File";
|
||||||
audio : Audio_Data;
|
audio : Audio_Data;
|
||||||
|
|||||||
@ -250,6 +250,8 @@ get_trile_editor_camera :: () -> Camera {
|
|||||||
|
|
||||||
global_palette_scroll : float = 0.0;
|
global_palette_scroll : float = 0.0;
|
||||||
trile_palette_scroll : float = 0.0;
|
trile_palette_scroll : float = 0.0;
|
||||||
|
use_color_picker : bool = false;
|
||||||
|
selected_palette : s32 = 0;
|
||||||
|
|
||||||
draw_tool_tab :: (theme: *GR.Overall_Theme, area: GR.Rect) {
|
draw_tool_tab :: (theme: *GR.Overall_Theme, area: GR.Rect) {
|
||||||
r := area;
|
r := area;
|
||||||
@ -275,23 +277,110 @@ draw_tool_tab :: (theme: *GR.Overall_Theme, area: GR.Rect) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
draw_swatches :: (entries: []Palette_Entry, inside: GR.Rect, block: float, scroll: *float, id_offset: s32, theme: *GR.Overall_Theme) -> (end_y: float) {
|
||||||
|
cols := max(1, cast(int)(inside.w / block));
|
||||||
|
for entry, idx: entries {
|
||||||
|
er : GR.Rect;
|
||||||
|
er.x = inside.x + (idx % cols) * block;
|
||||||
|
er.y = inside.y - scroll.* + (idx / cols) * block;
|
||||||
|
er.w = block; er.h = block;
|
||||||
|
btn := theme.button_theme;
|
||||||
|
btn.surface_color = .{entry.r, entry.g, entry.b, 1.0};
|
||||||
|
if GR.button(er, "", *btn, id_offset + cast(s32)idx) {
|
||||||
|
current_color = .{entry.r, entry.g, entry.b};
|
||||||
|
roughness = xx entry.roughness;
|
||||||
|
metallic = xx entry.metallic;
|
||||||
|
emittance = xx entry.emittance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rows := ifx entries.count > 0 then (entries.count + cols - 1) / cols else 0;
|
||||||
|
return inside.y + rows * block;
|
||||||
|
}
|
||||||
|
|
||||||
draw_material_tab :: (theme: *GR.Overall_Theme, area: GR.Rect) {
|
draw_material_tab :: (theme: *GR.Overall_Theme, area: GR.Rect) {
|
||||||
r := area;
|
r := area;
|
||||||
r.h = ui_h(42, 0);
|
row_h := ui_h(4, 0);
|
||||||
GR.color_picker(r, *current_color, *theme.color_picker_theme);
|
block := ui_h(3, 2);
|
||||||
r.y += r.h;
|
bottom := area.y + area.h;
|
||||||
r.h = ui_h(100,0) - r.y;
|
sliders_h := ui_h(18, 0);
|
||||||
r.h -= ui_h(18,0);
|
|
||||||
r.h /= 2;
|
// Toggle: Palette | Color Picker
|
||||||
region, inside := GR.begin_scrollable_region(r, *theme.scrollable_region_theme);
|
r.h = row_h;
|
||||||
s := inside;
|
half := r.w / 2;
|
||||||
GR.end_scrollable_region(region, s.x + s.w, s.y + s.h, *global_palette_scroll);
|
r.w = half;
|
||||||
r.y += r.h;
|
if GR.button(r, "Palette", *t_button_selectable(theme, !use_color_picker)) then use_color_picker = false;
|
||||||
region, inside = GR.begin_scrollable_region(r, *theme.scrollable_region_theme);
|
r.x += half;
|
||||||
s = inside;
|
if GR.button(r, "Color Picker", *t_button_selectable(theme, use_color_picker)) then use_color_picker = true;
|
||||||
GR.end_scrollable_region(region, s.x + s.w, s.y + s.h, *trile_palette_scroll);
|
r.x = area.x; r.w = area.w;
|
||||||
r.y += r.h;
|
r.y += row_h;
|
||||||
r.h = ui_h(3,2);
|
|
||||||
|
available := bottom - r.y - sliders_h;
|
||||||
|
top_h := ifx use_color_picker then ui_h(42, 0) else available / 2;
|
||||||
|
bot_h := available - top_h;
|
||||||
|
|
||||||
|
r.h = top_h;
|
||||||
|
if use_color_picker {
|
||||||
|
GR.color_picker(r, *current_color, *theme.color_picker_theme);
|
||||||
|
} else {
|
||||||
|
// Palette file selector
|
||||||
|
if g_palettes.count > 1 {
|
||||||
|
r.h = row_h;
|
||||||
|
pal_w := r.w / cast(float)g_palettes.count;
|
||||||
|
for pal, idx: g_palettes {
|
||||||
|
pr := r;
|
||||||
|
pr.x = area.x + idx * pal_w;
|
||||||
|
pr.w = pal_w;
|
||||||
|
if GR.button(pr, pal.name, *t_button_selectable(theme, cast(s32)idx == selected_palette), cast(s32)idx + 20000) {
|
||||||
|
selected_palette = cast(s32)idx;
|
||||||
|
global_palette_scroll = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
r.y += row_h;
|
||||||
|
top_h -= row_h;
|
||||||
|
r.h = top_h;
|
||||||
|
}
|
||||||
|
entries : []Palette_Entry;
|
||||||
|
if g_palettes.count > 0 {
|
||||||
|
selected_palette = clamp(selected_palette, 0, cast(s32)g_palettes.count - 1);
|
||||||
|
entries = g_palettes[selected_palette].entries;
|
||||||
|
}
|
||||||
|
region, inside := GR.begin_scrollable_region(r, *theme.scrollable_region_theme);
|
||||||
|
end_y := draw_swatches(entries, inside, block, *global_palette_scroll, 0, theme);
|
||||||
|
GR.end_scrollable_region(region, inside.x + inside.w, end_y, *global_palette_scroll);
|
||||||
|
}
|
||||||
|
r.y += top_h;
|
||||||
|
|
||||||
|
// Trile material picker
|
||||||
|
unique_mats : [..]Material;
|
||||||
|
unique_mats.allocator = temp;
|
||||||
|
for x: 0..15 for y: 0..15 for z: 0..15 {
|
||||||
|
trix := editor_current_trile.trixels[x][y][z];
|
||||||
|
if trix.empty then continue;
|
||||||
|
mr, mg, mb, ma := material_to_rgba(trix.material);
|
||||||
|
key := (cast(u32)mr << 24) | (cast(u32)mg << 16) | (cast(u32)mb << 8) | cast(u32)ma;
|
||||||
|
already := false;
|
||||||
|
for um: unique_mats {
|
||||||
|
ur, ug, ub, ua := material_to_rgba(um);
|
||||||
|
if ((cast(u32)ur << 24) | (cast(u32)ug << 16) | (cast(u32)ub << 8) | cast(u32)ua) == key { already = true; break; }
|
||||||
|
}
|
||||||
|
if !already array_add(*unique_mats, trix.material);
|
||||||
|
}
|
||||||
|
as_entries : [..]Palette_Entry;
|
||||||
|
as_entries.allocator = temp;
|
||||||
|
for mat: unique_mats {
|
||||||
|
e : Palette_Entry;
|
||||||
|
e.r = mat.color.x; e.g = mat.color.y; e.b = mat.color.z;
|
||||||
|
e.roughness = mat.roughness; e.metallic = mat.metallic; e.emittance = mat.emittance;
|
||||||
|
array_add(*as_entries, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
r.h = bot_h;
|
||||||
|
region2, inside2 := GR.begin_scrollable_region(r, *theme.scrollable_region_theme);
|
||||||
|
end_y2 := draw_swatches(as_entries, inside2, block, *trile_palette_scroll, 10000, theme);
|
||||||
|
GR.end_scrollable_region(region2, inside2.x + inside2.w, end_y2, *trile_palette_scroll);
|
||||||
|
r.y += bot_h;
|
||||||
|
|
||||||
|
r.h = ui_h(3, 2);
|
||||||
GR.label(r, "Roughness", *t_label_left(theme));
|
GR.label(r, "Roughness", *t_label_left(theme));
|
||||||
r.y += r.h;
|
r.y += r.h;
|
||||||
GR.slider(r, *roughness, 0, 7, 1, *theme.slider_theme);
|
GR.slider(r, *roughness, 0, 7, 1, *theme.slider_theme);
|
||||||
@ -303,7 +392,6 @@ draw_material_tab :: (theme: *GR.Overall_Theme, area: GR.Rect) {
|
|||||||
GR.label(r, "Emittance", *t_label_left(theme));
|
GR.label(r, "Emittance", *t_label_left(theme));
|
||||||
r.y += r.h;
|
r.y += r.h;
|
||||||
GR.slider(r, *emittance, 0, 2, 1, *theme.slider_theme);
|
GR.slider(r, *emittance, 0, 2, 1, *theme.slider_theme);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -143,6 +143,23 @@ Material :: struct {
|
|||||||
color : Vector3 = .{1.0, 0.0, 1.0};
|
color : Vector3 = .{1.0, 0.0, 1.0};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Palette_Entry :: struct {
|
||||||
|
name : string;
|
||||||
|
r : float = 1.0;
|
||||||
|
g : float = 0.0;
|
||||||
|
b : float = 1.0;
|
||||||
|
roughness : int = 4;
|
||||||
|
metallic : int = 0;
|
||||||
|
emittance : int = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Loaded_Palette :: struct {
|
||||||
|
name : string;
|
||||||
|
entries : [..]Palette_Entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_palettes : [..]Loaded_Palette;
|
||||||
|
|
||||||
Trixel :: struct {
|
Trixel :: struct {
|
||||||
material : Material;
|
material : Material;
|
||||||
empty : bool = false;
|
empty : bool = false;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user