Files
QuelSolaar/la_pop_up.c
2026-02-28 11:12:52 +01:00

1119 lines
34 KiB
C

#define SEDUCE_GEO_PREVIEW_DEFINE 1
#include "la_includes.h"
#include "la_geometry_undo.h"
#include "la_tool.h"
#include "la_projection.h"
#include "la_pop_up.h"
#include "hxa_enough.h"
/*
struct{
void *ring;
void *empty_star;
void *manipulator_star;
void *edge_star;
void *polygon_star;
void *browser_star;
void *select_star;
char text[48];
void *text_button;
void *slider;
void *complexity_slider;
void *treshold_slider;
char *mouse[3];
float mouse_pos[3];
float popup_pos[3];
}GlobalPopupData;*/
void la_intro_draw(void *user);
void la_geometry_load_obj(char *file);
void la_geometry_save_obj(char *file);
void connect_type_in_func(void *user, char *text)
{
e_vc_connect(text, "unknown", "none", NULL);
}
extern void la_edit_func(BInputState *input, void *user);
extern void geometry_save(void);
extern void geometry_load(char *file);
extern void start_macro_record(char *file);
extern void start_macro_play_back(char *file);
extern void stop_macro(void);
extern void save_node_vnf(ENode *node, uint *node_count, FILE *file);
extern void test_ref_creator(void);
extern void draw_settings_menu(BInputState *input, void *user);
void la_geometry_load_obj(char *file);
uint lo_preview_texture_get(ENode *node);
void lo_preview_texture_get_pos(ENode *node, float *pos);
void lo_preview_texture_set_pos(ENode *node, float *pos);
boolean la_pu_object_selection(BInputState *input, boolean active)
{
float center[3] = {0, 0, 0}, pos[3], aspect, color[3] = {1, 0.0, 0.2};
static float time = 0, slider_pos = 1, slider = 20.0, scroll;
static uint row_count = 20.0;
static char search[64];
static uint grab_id = -1;
uint i = 0, texture_id, count = 0;
float size = 0.5, f, delta, text_size, text_length;
char *name;
ENode *node;
seduce_animate(input, &time, active, 1.0);
if(time < 0.01)
return FALSE;
aspect = betray_screen_mode_get(NULL, NULL, NULL);
for(node = e_ns_get_node_next(0, 0, V_NT_GEOMETRY); node != NULL; node = e_ns_get_node_next(e_ns_get_node_id(node) + 1, 0, V_NT_GEOMETRY))
if(lo_preview_texture_get(node) != -1)
count++;
center[0] = input->pointers[0].pointer_x;
center[1] = input->pointers[0].pointer_y;
if(input->mode == BAM_EVENT)
if(!input->pointers[0].button[0] && !input->pointers[0].last_button[0])
grab_id = -1;
delta = input->delta_time * 5.0;
if(delta > 1.0)
delta = 1.0;
for(node = e_ns_get_node_next(0, 0, V_NT_GEOMETRY); node != NULL; node = e_ns_get_node_next(e_ns_get_node_id(node) + 1, 0, V_NT_GEOMETRY))
{
texture_id = lo_preview_texture_get(node);
if(texture_id != -1 && e_search_node(node, search))
{
if(input->mode == BAM_DRAW)
{
lo_preview_texture_get_pos(node, pos);
pos[0] = pos[0] * (1 - delta) + delta * ((float)(i % row_count) * 2.0 / (float)row_count - 1.0);
pos[1] = pos[1] * (1 - delta) + delta * ((float)(i / row_count) * -2.0 / (float)row_count + aspect - (2 / (float)row_count));
pos[2] = pos[2] * (1 - delta) + delta * (2.0 / (float)row_count);
lo_preview_texture_set_pos(node, pos);
seduce_background_image_draw(input, node, pos[0], pos[1] + scroll, 0, pos[2], pos[2], 0, 0, 1, 1, time, center, texture_id);
name = e_ns_get_node_name(node);
text_length = seduce_text_line_length(NULL, SEDUCE_T_SIZE, SEDUCE_T_SPACE, name, -1);
text_size = 1.0;
if(text_length > pos[2] * 0.9)
text_size = pos[2] * 0.9 / text_length;
// seduce_text_line_draw(NULL, pos[0] + pos[2] * 0.5 - 0.5 * text_length * text_size, pos[1] + SEDUCE_T_SIZE * 0.5, text_size * SEDUCE_T_SIZE, SEDUCE_T_SPACE, name, 1, 1, 1, 1, -1);
}
if(input->mode == BAM_EVENT)
{
if(node == seduce_element_pointer_id(input, 0, NULL))
{
if(input->pointers[0].button[0] && !input->pointers[0].last_button[0])
{
grab_id = e_ns_get_node_id(node);
}
}
if(grab_id == e_ns_get_node_id(node) && !input->pointers[0].button[0] && input->pointers[0].last_button[0])
{
scroll = 0;
search[0] = 0;
udg_set_modeling_node(e_ns_get_node_id(node));
return TRUE;
}
}
i++;
}
}
if(input->mode == BAM_EVENT)
{
if(input->pointers[0].button[0])
{
scroll += input->pointers[0].delta_pointer_y;
f = input->pointers[0].click_pointer_y[0] - input->pointers[0].pointer_y;
if(f > 0.05 || f < -0.5)
grab_id = -1;
}
if(betray_button_get(-1, BETRAY_BUTTON_SCROLL_UP))
scroll += (2.0 / (float)row_count);
if(betray_button_get(-1, BETRAY_BUTTON_SCROLL_DOWN))
scroll -= (2.0 / (float)row_count);
f = ((float)(i / row_count) * -2.0 / (float)row_count + aspect - (2 / (float)row_count)) - (2.0 / (float)row_count);
// if(f + scroll > -aspect)
// scroll = aspect - f;
if(f + scroll > -aspect)
scroll = -(f + aspect);
if(scroll < 0)
scroll = 0;
}
if(input->mode == BAM_DRAW)
{
SeduceBackgroundObject *object;
/* seduce_background_quad_draw(input, &grab_id, 0,
-1.05, -1.05 * aspect, -0.05,
1.05, -1.05 * aspect, -0.05,
1.05, -1.05 * (aspect - 0.05), -0.05,
-1.05, -1.05 * (aspect - 0.05), -0.05,
0, 0, 1,
0.5, 0.5, 0.5, 0.7);*/
object = seduce_background_object_allocate();
seduce_background_square_add(object, NULL, 0,
-1.05, -1.05 * aspect, -0.05,
2.1, 0.05,
0.5, 0.5, 0.5, 0.7);
seduce_primitive_surface_draw(input, object, time);
seduce_background_polygon_flush(input, center, time);
seduce_primitive_background_object_free(object);
}
if(seduce_widget_button_icon(input, &time, SEDUCE_OBJECT_CLOSE, 1 - 0.025, -aspect + 0.025, 0.025, time, color))
{
scroll = 0;
search[0] = 0;
return TRUE;
}
seduce_widget_slider_line(input, &row_count, &slider, 0, -aspect + 0.025, 1 - 0.05, -aspect + 0.025, 0.035, 0.1, 1.0, 40, time, color, FALSE);
row_count = slider + 0.5;
if(row_count < 1)
row_count = 1;
seduce_text_edit_line(input, &search, NULL, search, 64, 0.025 - 1.0, -aspect + 0.0125, 1, 0.025 * 0.5, seduce_translate("Search"), TRUE, NULL, NULL, 0.2, 0.6, 1.0, 1, 1, 0, 0, 1);
return FALSE;
}
extern void la_geometry_load_hxa(char *file_name);
extern void hxa_util_triangulate_node(HXANode *node, unsigned int max_sides);
extern float *hxa_unreferenced_vertex_array_build(HXANode *node, char **names, unsigned char *component_ids, float *defaults, unsigned intcomponent_count);
extern void hxa_util_normal_corner(HXANode *node);
LAPUEmptyReturn la_pu_empty(BInputState *input, boolean active)
{
static SUIPUElement *element = NULL;
static uint element_allocations = 0;
static float x, y, static_start = 0, rotate = 0, time = 0;
static char *types[2] = {"obj", "hxa"};
float brightness = 0.5, tmp[2], aspect;
BInputState fake_input;
BInputPointerState *pointers;
uint start = 0, ring, count = 4, i, j, layer_count = 0, texture_id;
ENode *node;
EGeoLayer *layer;
char *path;
seduce_animate(input, &time, active, 4.0);
path = betray_requester_save_get(&element[1]);
node = e_ns_get_node(0, udg_get_modeling_node());
if(path != NULL)
{
if(f_text_filter_case_insensitive(path, ".array"))
{
/* FILE* file;
float defaults[6] = {0, 0, 0, 0, 0, 1}, *array;
unsigned char component_ids[6] = {0, 1, 2, 0, 1, 2};
char *names[6] = {HXA_CONVENTION_HARD_BASE_VERTEX_LAYER_NAME, HXA_CONVENTION_HARD_BASE_VERTEX_LAYER_NAME, HXA_CONVENTION_HARD_BASE_VERTEX_LAYER_NAME, HXA_CONVENTION_SOFT_LAYER_NORMALS, HXA_CONVENTION_SOFT_LAYER_NORMALS, HXA_CONVENTION_SOFT_LAYER_NORMALS};
HXANode *hxa_node;
uint i;
hxa_node = malloc(sizeof *hxa_node);
enough_to_hxa_node_geometry(node, hxa_node);
hxa_util_triangulate_node(hxa_node, 3);
hxa_util_normal_corner(hxa_node);
array = hxa_unreferenced_vertex_array_build(hxa_node, names, component_ids, defaults, 6);
file = fopen(path, "w");
if(file != NULL)
{
fprintf(file, "float array[%u * 6] = {%f, %f, %f, %f, %f, %f\n", hxa_node->content.geometry.edge_corner_count, array[0], array[1], array[2], array[3], array[4], array[5]);
for(i = 1; i < hxa_node->content.geometry.edge_corner_count; i++)
fprintf(file, "\t\t, %f, %f, %f, %f, %f, %f\n", array[i * 6], array[i * 6 + 1], array[i * 6 + 2], array[i * 6 + 3], array[i * 6 + 4], array[i * 6 + 5]);
fprintf(file, "};\n");
fclose(file);
}*/
}
else if(f_text_filter_case_insensitive(path, ".hxa"))
enough_to_hxa_one(path, node);
else
la_geometry_save_obj(path);
}
path = betray_requester_save_get(&element[2]);
if(path != NULL)
enough_to_hxa_all(path);
path = betray_requester_load_get(element);
if(path != NULL)
{
if(f_text_filter_case_insensitive(path, ".hxa"))
la_geometry_load_hxa(path);
else
la_geometry_load_obj(path);
}
if(time < 0.01)
return LA_PUER_NONE;
node = e_ns_get_node(0, udg_get_modeling_node());
if(node != NULL && V_NT_GEOMETRY == e_ns_get_node_type(node))
for(layer = e_nsg_get_layer_next(node, 0); layer != NULL; layer = e_nsg_get_layer_next(node, e_nsg_get_layer_id(layer) + 1))
if(VN_G_LAYER_VERTEX_XYZ == e_nsg_get_layer_type(layer))
layer_count++;
if((layer_count + 10) > element_allocations)
{
element_allocations = (layer_count + 10);
if(element != NULL)
free(element);
element = malloc((sizeof *element) * element_allocations);
}
aspect = betray_screen_mode_get(NULL, NULL, NULL);
start = static_start;
element[0].type = S_PUT_TOP;
element[0].text = seduce_translate("Settings");
element[1].type = S_PUT_TOP;
element[1].text = seduce_translate("Add Layer");
element[2].type = S_PUT_TOP;
element[2].text = seduce_translate("Load");
element[3].type = S_PUT_TOP;
element[3].text = seduce_translate("Save");
element[4].type = S_PUT_TOP;
element[4].text = seduce_translate("Save All");
element[5].type = S_PUT_TOP;
element[5].text = seduce_translate("Rename");
element[6].type = S_PUT_TOP;
element[6].text = seduce_translate("New");
element[7].type = S_PUT_ANGLE;
element[7].text = seduce_translate("Undo");
element[7].data.angle[0] = 45;
element[7].data.angle[1] = 135;
element[8].type = S_PUT_ANGLE;
element[8].text = seduce_translate("Redo");
element[8].data.angle[0] = 225;
element[8].data.angle[1] = 315;
element[9].type = S_PUT_ANGLE;
element[9].text = seduce_translate("Select Geometry");
element[9].data.angle[0] = 135;
element[9].data.angle[1] = 225;
count = 10;
i = 0;
node = e_ns_get_node(0, udg_get_modeling_node());
if(node != NULL && V_NT_GEOMETRY == e_ns_get_node_type(node))
{
for(layer = e_nsg_get_layer_next(node, 0); layer != NULL; layer = e_nsg_get_layer_next(node, e_nsg_get_layer_id(layer) + 1))
{
if(VN_G_LAYER_VERTEX_XYZ == e_nsg_get_layer_type(layer))
{
element[count].type = S_PUT_TOP;
element[count].text = e_nsg_get_layer_name(layer);
count++;
}
}
}
rotate += betray_time_delta_get() * 20;
if(input->pointers[0].button[2] == TRUE)
{
x = input->pointers[0].click_pointer_x[2];
y = input->pointers[0].click_pointer_y[2];
}
if(input->mode == BAM_DRAW)
{
r_matrix_push(NULL);
r_matrix_translate(NULL, x, y, 0);
}
fake_input = *input;
fake_input.pointers = pointers = malloc((sizeof *pointers) * input->pointer_count);
for(i = 0; i < input->pointer_count; i++)
{
pointers[i] = input->pointers[i];
pointers[i].button[0] = !pointers[i].button[2];
pointers[i].last_button[0] = !pointers[i].last_button[2];
}
ring = seduce_popup(&fake_input, element, element, count, time, TRUE);
free(pointers);
if(input->mode == BAM_DRAW)
r_matrix_pop(NULL);
switch(ring)
{
case 0 :
return LA_PUER_SETTINGS;
break;
case 1 :
udg_create_new_modeling_layer();
break;
case 2 :
betray_requester_load(types, 2, element);
break;
case 3 :
betray_requester_save(types, 2, &element[1]);
break;
case 4 :
betray_requester_save(types, 2, &element[2]);
break;
case 5 :
return LA_PUER_RENAME;
break;
case 6 :
udg_create_new_modeling_node();
return LA_PUER_RENAME;
break;
case 7 :
udg_undo_geometry();
break;
case 8 :
udg_redo_geometry();
break;
case 9 :
return LA_PUER_OBJECT_SELECT;
break;
}
count = 10;
if(ring >= count && node != NULL && V_NT_GEOMETRY == e_ns_get_node_type(node))
{
for(layer = e_nsg_get_layer_next(node, 0); layer != NULL; layer = e_nsg_get_layer_next(node, e_nsg_get_layer_id(layer) + 1))
{
if(VN_G_LAYER_VERTEX_XYZ == e_nsg_get_layer_type(layer))
{
if(count == ring)
udg_set_modeling_layer(e_nsg_get_layer_id(layer));
count++;
}
}
}
return LA_PUER_NONE;
/* if(input->mode == BAM_DRAW)
{
if(preview)
e_ns_set_custom_func(0, V_NT_GEOMETRY, lo_geo_preview_func);
glPushMatrix();
glTranslatef(-0.8 + 0.9 / 16.0, y - 0.06, 0);
glScalef(1.6 / (16.0 * 1.6), 1.6 / (16.0 * 1.6), 1.6 / (16.0 * 1.6));
i = 1;
glPushMatrix();
tmp[0] = -(input->pointers[0].pointer_x + 0.8 - 1.0 / 16.0) / (1.6 / (16.0 * 1.6));
tmp[1] = -(-input->pointers[0].pointer_y + y - 0.06) / (1.6 / (16.0 * 1.6));
brightness = 0.5;
if(tmp[0] * tmp[0] + tmp[1] * tmp[1] < 0.8 * 0.8)
brightness = 1.0;
seduce_text_line_draw(NULL, seduce_text_line_length(NULL, SEDUCE_T_SIZE / 2.0 * (16.0 * 1.6), SEDUCE_T_SPACE, "NEW", -1) * -0.5, 0, SEDUCE_T_SIZE / 2.0 * (16.0 * 1.6), SEDUCE_T_SPACE, "NEW", brightness, brightness, brightness, brightness, -1);
glPopMatrix();
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE);
for(node = e_ns_get_node_next(0, 0, V_NT_GEOMETRY); node != NULL; node = e_ns_get_node_next(e_ns_get_node_id(node) + 1, 0, V_NT_GEOMETRY))
{
if((float)(i / 16) * 1.6 * (1.6 / (16.0 * 1.6)) - y > aspect + 0.2)
break;
if((float)(i / 16) * 1.6 * (1.6 / (16.0 * 1.6)) - y > -aspect - 0.2)
{
glPushMatrix();
glTranslatef((float)(i % 16) * 1.6, -1.6 * (float)(i / 16), 0);
tmp[0] = (float)(i % 16) * 1.6 - (input->pointers[0].pointer_x + 0.8 - 1.0 / 16.0) / (1.6 / (16.0 * 1.6));
tmp[1] = (float)(i / 16) * 1.6 - (-input->pointers[0].pointer_y + y - 0.06) / (1.6 / (16.0 * 1.6));
brightness = 0.1;
if(preview)
{
e_ns_set_custom_data(node, 0, lo_preview_geometry_update(node, e_ns_get_custom_data(node, 0)));
if(tmp[0] * tmp[0] + tmp[1] * tmp[1] < 0.8 * 0.8)
{
brightness = 0.4;
seduce_text_line_draw(NULL, seduce_text_line_length(NULL, SEDUCE_T_SIZE / 2.0 * (16.0 * 1.6), SEDUCE_T_SPACE, e_ns_get_node_name(node), -1) * -0.5, - 0.8, SEDUCE_T_SIZE / 2.0 * (16.0 * 1.6), SEDUCE_T_SPACE, e_ns_get_node_name(node), 1.0, 1.0, 1.0, 1.0, -1);
}
glRotatef(rotate, 0, 1, 0);
if(!lo_preview_geometry_draw(e_ns_get_custom_data(node, 0), brightness))
seduce_text_line_draw(NULL, seduce_text_line_length(NULL, SEDUCE_T_SIZE / 2.0 * (16.0 * 1.6), SEDUCE_T_SPACE, "EMPTY", -1) * -0.5, 0, SEDUCE_T_SIZE / 2.0 * (16.0 * 1.6), SEDUCE_T_SPACE, "EMPTY", brightness, brightness, brightness, brightness, -1);
}else
{
if(tmp[0] * tmp[0] + tmp[1] * tmp[1] < 0.8 * 0.8)
brightness = 0.4;
seduce_text_line_draw(NULL, seduce_text_line_length(NULL, SEDUCE_T_SIZE / 3.0 * (16.0 * 1.6), SEDUCE_T_SPACE, e_ns_get_node_name(node), -1) * -0.5, 0, SEDUCE_T_SIZE / 3.0 * (16.0 * 1.6), SEDUCE_T_SPACE, e_ns_get_node_name(node), brightness, brightness, brightness, brightness, -1);
}
glPopMatrix();
}
i++;
}
if(input->pointers[0].pointer_y > aspect * 0.9 && y > aspect * 0.8)
y -= betray_time_delta_get() * 2;
if(input->pointers[0].pointer_y < aspect * -0.9 && aspect * 0.8 / (1.6 / (16.0 * 1.6)) < (float)(i / 16) * 1.6 - (y - 0.06) / (1.6 / (16.0 * 1.6)))
y += betray_time_delta_get() * 2;
glPopMatrix();
glPopMatrix();
glPushMatrix();
glPushMatrix();
glEnable(GL_DEPTH_TEST);
}else if(input->pointers[0].button[2] == FALSE && input->pointers[0].last_button[2] == TRUE)
{
tmp[0] = -(input->pointers[0].pointer_x + 0.8 - 1.0 / 16.0) / (1.6 / (16.0 * 1.6));
tmp[1] = -(-input->pointers[0].pointer_y + y - 0.06) / (1.6 / (16.0 * 1.6));
if(tmp[0] * tmp[0] + tmp[1] * tmp[1] < 0.8 * 0.8)
udg_create_new_modeling_node();
i = 1;
for(node = e_ns_get_node_next(0, 0, V_NT_GEOMETRY); node != NULL; node = e_ns_get_node_next(e_ns_get_node_id(node) + 1, 0, V_NT_GEOMETRY))
{
tmp[0] = (float)(i % 16) * 1.6 - (input->pointers[0].pointer_x + 0.8 - 1.0 / 16.0) / (1.6 / (16.0 * 1.6));
tmp[1] = (float)(i / 16) * 1.6 - (-input->pointers[0].pointer_y + y - 0.06) / (1.6 / (16.0 * 1.6));
if(tmp[0] * tmp[0] + tmp[1] * tmp[1] < 0.8 * 0.8)
{
udg_set_modeling_node(e_ns_get_node_id(node));
lo_preview_geometry_center(e_ns_get_custom_data(node, 0));
}
i++;
}
}
if(ring > 3)
return TRUE;
else
return FALSE;*/
}
void la_pu_vertex(BInputState *input, uint vertex, boolean active)
{
/* static double value;
double pos[3], output[3];
glDisable(GL_DEPTH_TEST);
glPopMatrix();
glPopMatrix();
glPushMatrix();
udg_get_vertex_pos(pos, vertex);
p_get_projection_screen(output, pos[0], pos[1], pos[2]);
glTranslatef(-output[0], -output[1], -1);
input->pointers[0].pointer_x += output[0];
input->pointers[0].pointer_y += output[1];
input->pointers[0].click_pointer_x[0] += output[0];
input->pointers[0].click_pointer_y[0] += output[2];
input->pointers[0].pointer_x -= output[0];
input->pointers[0].pointer_y -= output[1];
input->pointers[0].click_pointer_x[0] -= output[0];
input->pointers[0].click_pointer_y[0] -= output[2];
udg_set_select(vertex, value);
glPopMatrix();
glPushMatrix();
glPushMatrix();
glEnable(GL_DEPTH_TEST);*/
}
void me_create_tree();
boolean la_pu_manipulator(BInputState *input, boolean active)
{
static BInputState fake_input;
BInputPointerState *pointers;
static SUIPUElement element[29];
static float x, y, time = 0;
uint ring, i, j;
seduce_animate(input, &time, active, 4.0);
if(time < 0.01)
return FALSE;
element[0].type = S_PUT_ANGLE;
element[0].text = seduce_translate("Reverse Selection");
element[0].data.angle[0] = 45;
element[0].data.angle[1] = 75;
element[1].type = S_PUT_ANGLE;
element[1].text = seduce_translate("Duplicate");
element[1].data.angle[0] = 75;
element[1].data.angle[1] = 105;
element[2].type = S_PUT_ANGLE;
element[2].text = seduce_translate("Detach");
element[2].data.angle[0] = 105;
element[2].data.angle[1] = 135;
element[3].type = S_PUT_ANGLE;
element[3].text = seduce_translate("Collapse");
element[3].data.angle[0] = 45 + 180;
element[3].data.angle[1] = 75 + 180;
element[4].type = S_PUT_ANGLE;
element[4].text = seduce_translate("Full Crease");
element[4].data.angle[0] = 75 + 180;
element[4].data.angle[1] = 105 + 180;
element[5].type = S_PUT_ANGLE;
element[5].text = seduce_translate("No Crease");
element[5].data.angle[0] = 105 + 180;
element[5].data.angle[1] = 135 + 180;
element[6].type = S_PUT_TOP;
element[6].text = seduce_translate("Flip");
element[7].type = S_PUT_TOP;
element[7].text = seduce_translate("Smooth Selection");
element[8].type = S_PUT_TOP;
element[8].text = seduce_translate("Poly gone");
element[9].type = S_PUT_TOP;
element[9].text = seduce_translate("Mirror");
element[10].type = S_PUT_TOP;
element[10].text = seduce_translate("Flatten");
element[11].type = S_PUT_TOP;
element[11].text = seduce_translate("Slice");
element[12].type = S_PUT_TOP;
element[12].text = seduce_translate("Slice Off");
element[13].type = S_PUT_TOP;
element[13].text = seduce_translate("Weld");
element[14].type = S_PUT_TOP;
element[14].text = seduce_translate("Center Geometry");
element[15].type = S_PUT_BOTTOM;
element[15].text = seduce_translate("Center Manipulator");
element[16].type = S_PUT_BOTTOM;
element[16].text = seduce_translate("Create Tag");
element[17].type = S_PUT_BOTTOM;
element[17].text = seduce_translate("Triangulate");
element[18].type = S_PUT_BOTTOM;
element[18].text = seduce_translate("Auto Crease");
element[19].type = S_PUT_BOTTOM;
element[19].text = seduce_translate("Find Quads");
element[20].type = S_PUT_BOTTOM;
element[20].text = seduce_translate("Cut");
element[21].type = S_PUT_BOTTOM;
element[21].text = seduce_translate("Copy");
element[22].type = S_PUT_BOTTOM;
element[22].text = seduce_translate("Paste");
element[23].type = S_PUT_BOTTOM;
element[23].text = seduce_translate("Copy to new");
element[24].type = S_PUT_BOTTOM;
element[24].text = seduce_translate("Revert to base");
element[25].type = S_PUT_BOTTOM;
element[25].text = seduce_translate("Vertex delete");
element[26].type = S_PUT_BOTTOM;
element[26].text = seduce_translate("Model Cleanup");
element[27].type = S_PUT_BOTTOM;
element[27].text = seduce_translate("Symmetry");
element[28].type = S_PUT_BOTTOM;
element[28].text = seduce_translate("Reset Axis Space");
if(input->pointers[0].button[2] == TRUE)
{
x = input->pointers[0].click_pointer_x[2];
y = input->pointers[0].click_pointer_y[2];
}
if(input->mode == BAM_DRAW)
{
r_matrix_push(NULL);
r_matrix_translate(NULL, x, y, 0);
}
fake_input = *input;
fake_input.pointers = pointers = malloc((sizeof *pointers) * input->pointer_count);
for(i = 0; i < input->pointer_count; i++)
{
pointers[i] = input->pointers[i];
pointers[i].button[0] = !pointers[i].button[2];
pointers[i].last_button[0] = !pointers[i].last_button[2];
}
ring = seduce_popup(&fake_input, element, element, 29, time, TRUE);
free(pointers);
if(input->mode == BAM_DRAW)
r_matrix_pop(NULL);
// ring = -1;//s_popup(input, x, y, element, 28, &time, active, 1, 1, 1, 0.2, 0.6, 1.0);
if(active)
{
switch(ring)
{
case 0 :
{
uint32 i, vertex_count;
double *vertex;
udg_get_geometry(&vertex_count, NULL, &vertex, NULL, NULL);
for(i = 0; i < vertex_count; i++)
if(vertex[i * 3] != V_REAL64_MAX)
udg_set_select(i, 1 - udg_get_select(i));
}
return TRUE;
case 1 :
// me_create_tree();
la_t_duplicate_selected_polygons();
return TRUE;
case 2 :
// me_create_tree();
la_t_detach_selected_polygons();
return TRUE;
case 3 :
// me_create_tree();
la_t_collapse_selected_vertexes();
return TRUE;
case 4 :
la_t_crease_selected(-1);
return TRUE;
case 5 :
la_t_crease_selected(0);
return TRUE;
case 6 :
la_t_flip_selected_polygons();
return TRUE;
case 7 :
la_t_smooth_select();
return TRUE;
case 8 :
la_t_delete_selection();
return TRUE;
case 9 :
{
double pos[3], vector[3];
la_t_tm_get_pos(pos);
la_t_tm_get_vector(vector);
la_t_mirror(pos, vector);
la_t_flip_selected_polygons();
}
return TRUE;
case 10 :
{
double pos[3], vector[3];
la_t_tm_get_pos(pos);
la_t_tm_get_vector(vector);
la_t_flatten(pos, vector);
}
return TRUE;
case 11 :
{
double pos[3], vector[3];
la_t_tm_get_pos(pos);
la_t_tm_get_vector(vector);
la_t_slice(pos, vector, FALSE);
}
return TRUE;
case 12 :
{
double pos[3], vector[3];
la_t_tm_get_pos(pos);
la_t_tm_get_vector(vector);
la_t_slice(pos, vector, TRUE);
}
return TRUE;
case 13 :
{
la_t_weld_selected_vertexes();
}
return TRUE;
case 14 :
{
la_t_center_geometry();
}
return TRUE;
case 15 :
{
la_t_center_manipulator();
}
return TRUE;
case 16 :
{
double pos[3];
la_t_tm_get_pos(pos);
udg_create_tag(pos);
}
return TRUE;
case 17 :
{
la_t_poly_triangulate();
}
return TRUE;
case 18 :
{
la_t_poly_auto_crease();
}
return TRUE;
case 19 :
{
la_t_poly_find_quads();
}
return TRUE;
case 20 :
{
double pos[3];
la_t_tm_get_pos(pos);
la_t_copy(pos);
la_t_delete_selection();
}
return TRUE;
case 21 :
{
double pos[3];
la_t_tm_get_pos(pos);
la_t_copy(pos);
}
break;
case 22 :
{
double pos[3];
la_t_tm_get_pos(pos);
la_t_paste(pos);
}
return TRUE;
case 23 :
la_t_copy_to_new_geometry();
return TRUE;
case 24 :
la_t_revert_to_base();
return TRUE;
case 25 :
la_t_model_vertex_delete();
return TRUE;
case 26 :
la_t_model_cleanup();
return TRUE;
case 27 :
{
double pos[3], vector[3];
la_t_tm_get_pos(pos);
la_t_tm_get_vector(vector);
la_t_symmetry(pos, vector);
}
return TRUE;
case 28 :
la_view_axis_matrix_reset();
return TRUE;
}
}
return FALSE;
}
boolean la_pu_edge(BInputState *input, uint *edge, boolean active)
{
BInputState fake_input;
BInputPointerState *pointers;
static SUIPUElement element[10];
static float x, y, time = 0;
uint ring, i, j;
seduce_animate(input, &time, active, 4.0);
if(time < 0.01)
return FALSE;
element[0].type = S_PUT_ANGLE;
element[0].text = seduce_translate("Select Border");
element[0].data.angle[0] = 0;
element[0].data.angle[1] = 360 / 10.0 * 1.0;
element[1].type = S_PUT_ANGLE;
element[1].text = seduce_translate("Revolve");
element[1].data.angle[0] = 360 / 10.0 * 1.0;
element[1].data.angle[1] = 360 / 10.0 * 2.0;
element[2].type = S_PUT_ANGLE;
element[2].text = seduce_translate("Tube");
element[2].data.angle[0] = 360 / 10.0 * 2.0;
element[2].data.angle[1] = 360 / 10.0 * 3.0;
element[3].type = S_PUT_ANGLE;
element[3].text = seduce_translate("Wrap Around");
element[3].data.angle[0] = 360 / 10.0 * 3.0;
element[3].data.angle[1] = 360 / 10.0 * 4.0;
element[4].type = S_PUT_ANGLE;
element[4].text = seduce_translate("Select Hull");
element[4].data.angle[0] = 360 / 10.0 * 4.0;
element[4].data.angle[1] = 360 / 10.0 * 5.0;
element[5].type = S_PUT_ANGLE;
element[5].text = seduce_translate("Collapse");
element[5].data.angle[0] = 360 / 10.0 * 5.0;
element[5].data.angle[1] = 360 / 10.0 * 6.0;
element[6].type = S_PUT_ANGLE;
element[6].text = seduce_translate("Measure Grid");
element[6].data.angle[0] = 360 / 10.0 * 6.0;
element[6].data.angle[1] = 360 / 10.0 * 7.0;
element[7].type = S_PUT_ANGLE;
element[7].text = seduce_translate("Select Fill");
element[7].data.angle[0] = 360 / 10.0 * 7.0;
element[7].data.angle[1] = 360 / 10.0 * 8.0;
element[8].type = S_PUT_ANGLE;
element[8].text = seduce_translate("Define Axis Space");
element[8].data.angle[0] = 360.0 / 10.0 * 8.0;
element[8].data.angle[1] = 360.0 / 10.0 * 9.0;
element[9].type = S_PUT_ANGLE;
element[9].text = seduce_translate("Strip fill Hole");
element[9].data.angle[0] = 360.0 / 10.0 * 9.0;
element[9].data.angle[1] = 360.0 / 10.0 * 10.0;
if(input->pointers[0].button[2] == TRUE)
{
x = input->pointers[0].click_pointer_x[2];
y = input->pointers[0].click_pointer_y[2];
}
if(input->mode == BAM_DRAW)
{
r_matrix_push(NULL);
r_matrix_translate(NULL, x, y, 0);
}
fake_input = *input;
fake_input.pointers = pointers = malloc((sizeof *pointers) * input->pointer_count);
for(i = 0; i < input->pointer_count; i++)
{
pointers[i] = input->pointers[i];
pointers[i].button[0] = !pointers[i].button[2];
pointers[i].last_button[0] = !pointers[i].last_button[2];
pointers[i].button[2] = FALSE;
pointers[i].last_button[2] = FALSE;
}
ring = seduce_popup(&fake_input, element, element, 10, time, TRUE);
free(pointers);
if(input->mode == BAM_DRAW)
r_matrix_pop(NULL);
if(active)
{
switch(ring)
{
case 0 :
la_t_select_open_edge();
return TRUE;
case 1 :
la_t_revolve(edge, imagine_setting_integer_get("REVOLVE_INTERSECTIONS", 8, "Revolve uintersection count."));
return TRUE;
case 2 :
la_t_tube(edge, imagine_setting_integer_get("REVOLVE_INTERSECTIONS", 8, "Revolve uintersection count."));
return TRUE;
case 3 :
la_t_wrap_around(edge, imagine_setting_integer_get("REVOLVE_INTERSECTIONS", 8, "Revolve uintersection count."));
return TRUE;
case 4 :
// if(!la_t_edge_select(edge[0], edge[1]))
la_t_select_hull(edge);
return TRUE;
case 5 :
la_t_collapse_two_vertexes(edge[0], edge[1]);
return TRUE;
case 6 :
{
double a[3], b[3];
udg_get_vertex_pos(a, edge[0]);
udg_get_vertex_pos(b, edge[1]);
a[0] -= b[0];
a[1] -= b[1];
a[2] -= b[2];
seduce_view_grid_size_set(NULL, sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]));
la_t_tm_get_pos(b);
udg_set_grid_snap(b, sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]));
}
return TRUE;
case 7 :
la_t_vertex_select_fill(edge[0]);
return TRUE;
case 8 :
la_view_axis_matrix_edge_set(edge[0], edge[1]);
return TRUE;
case 9 :
// la_t_edge_fill_strip(edge[0], edge[1]);
la_t_edge_fill_hole(edge[0], edge[1]);
return TRUE;
}
}
return FALSE;
}
boolean la_pu_polygon(BInputState *input, uint polygon, boolean active)
{
static SUIPUElement element[11];
static float x = 0, y = 0, time = 0;
BInputState fake_input;
BInputPointerState *pointers;
uint ring, i, j;
seduce_animate(input, &time, active, 4.0);
if(time < 0.01)
return FALSE;
element[0].type = S_PUT_ANGLE;
element[0].text = seduce_translate("Mirror");
element[0].data.angle[0] = -135.0 / 7.0;
element[0].data.angle[1] = 135.0 / 7.0;
element[1].type = S_PUT_ANGLE;
element[1].text = seduce_translate("Flatten");
element[1].data.angle[0] = 135.0 / 7.0;
element[1].data.angle[1] = 135.0 / 7.0 * 3.0;
element[2].type = S_PUT_ANGLE;
element[2].text = seduce_translate("Deploy");
element[2].data.angle[0] = 135.0 / 7.0 * 3.0;
element[2].data.angle[1] = 135.0 / 7.0 * 5.0;
element[3].type = S_PUT_ANGLE;
element[3].text = seduce_translate("Slice");
element[3].data.angle[0] = 135.0 / 7.0 * 5.0;
element[3].data.angle[1] = 135.0 / 7.0 * 7.0;
element[4].type = S_PUT_ANGLE;
element[4].text = seduce_translate("Slice Off");
element[4].data.angle[0] = 225.0 + 135.0 / 7.0 * 0.0;
element[4].data.angle[1] = 225.0 + 135.0 / 7.0 * 2.0;
element[5].type = S_PUT_ANGLE;
element[5].text = seduce_translate("Split");
element[5].data.angle[0] = 225.0 + 135.0 / 7.0 * 2.0;
element[5].data.angle[1] = 225.0 + 135.0 / 7.0 * 4.0;
element[6].type = S_PUT_ANGLE;
element[6].text = seduce_translate("Define Axis Space");
element[6].data.angle[0] = 225.0 + 135.0 / 7.0 * 4.0;
element[6].data.angle[1] = 225.0 + 135.0 / 7.0 * 6.0;
element[7].type = S_PUT_BOTTOM;
element[7].text = seduce_translate("Fill Selection");
element[8].type = S_PUT_BOTTOM;
element[8].text = seduce_translate("Plane Select");
element[9].type = S_PUT_BOTTOM;
element[9].text = seduce_translate("Smooth Select");
element[10].type = S_PUT_BOTTOM;
element[10].text = seduce_translate("Convex Select");
if(input->pointers[0].button[2] == TRUE)
{
x = input->pointers[0].click_pointer_x[2];
y = input->pointers[0].click_pointer_y[2];
}
if(input->mode == BAM_DRAW)
{
r_matrix_push(NULL);
r_matrix_translate(NULL, x, y, 0);
}
fake_input = *input;
fake_input.pointers = pointers = malloc((sizeof *pointers) * input->pointer_count);
for(i = 0; i < input->pointer_count; i++)
{
pointers[i] = input->pointers[i];
pointers[i].button[0] = !pointers[i].button[2];
pointers[i].last_button[0] = !pointers[i].last_button[2];
}
ring = seduce_popup(&fake_input, element, element, 11, time, TRUE);
free(pointers);
if(input->mode == BAM_DRAW)
r_matrix_pop(NULL);
if(active)
{
switch(ring)
{
case 0 :
{
uint *ref;
double origo[3], vector[3];
udg_get_geometry(NULL, NULL, NULL, &ref, NULL);
la_t_face_vector(origo, vector, ref[polygon * 4], ref[polygon * 4 + 1], ref[polygon * 4 + 2]);
la_t_mirror(origo, vector);
la_t_flip_selected_polygons();
}
return TRUE;
case 1 :
{
uint *ref;
double origo[3], vector[3];
udg_get_geometry(NULL, NULL, NULL, &ref, NULL);
la_t_face_vector(origo, vector, ref[polygon * 4], ref[polygon * 4 + 1], ref[polygon * 4 + 2]);
la_t_flatten(origo, vector);
}
return TRUE;
case 2 :
la_t_deploy(polygon);
return TRUE;
case 3 :
{
uint *ref;
double origo[3], vector[3];
udg_get_geometry(NULL, NULL, NULL, &ref, NULL);
la_t_face_vector(origo, vector, ref[polygon * 4], ref[polygon * 4 + 1], ref[polygon * 4 + 2]);
la_t_slice(origo, vector, FALSE);
}
return TRUE;
case 4 :
{
uint *ref;
double origo[3], vector[3];
udg_get_geometry(NULL, NULL, NULL, &ref, NULL);
la_t_face_vector(origo, vector, ref[polygon * 4], ref[polygon * 4 + 1], ref[polygon * 4 + 2]);
la_t_slice(origo, vector, TRUE);
}
return TRUE;
case 5 :
la_t_poly_spliter(polygon);
return TRUE;
case 6 :
la_view_axis_matrix_poly_set(polygon, la_t_poly_egde_test(polygon, x, y));
return TRUE;
case 7 :
la_t_polygon_select_fill(polygon);
return TRUE;
case 8 :
la_t_poly_surface_select(polygon, LA_PSST_PLANE);
return TRUE;
case 9 :
la_t_poly_surface_select(polygon, LA_PSST_SMOOTH);
return TRUE;
case 10 :
la_t_poly_surface_select(polygon, LA_PSST_CONVEX);
return TRUE;
}
}
return FALSE;
}
uint la_pu_select(BInputState *input, boolean active)
{
static float time = 0, x = 0, y = 0;
static SUIPUElement element[4];
BInputState fake_input;
BInputPointerState *pointers;
uint ring, i, j;
seduce_animate(input, &time, active, 4.0);
if(time < 0.01)
return -1;
element[0].type = S_PUT_ANGLE;
element[0].text = seduce_translate("Select");
element[0].data.angle[0] = 0;
element[0].data.angle[1] = 90;
element[1].type = S_PUT_ANGLE;
element[1].text = seduce_translate("Deselect");
element[1].data.angle[0] = 90;
element[1].data.angle[1] = 180;
element[2].type = S_PUT_ANGLE;
element[2].text = seduce_translate("Sub");
element[2].data.angle[0] = 180;
element[2].data.angle[1] = 270;
element[3].type = S_PUT_ANGLE;
element[3].text = seduce_translate("Add");
element[3].data.angle[0] = 270;
element[3].data.angle[1] = 360;
if(active)
{
x = input->pointers[0].click_pointer_x[0];
y = input->pointers[0].click_pointer_y[0];
}
if(input->mode == BAM_DRAW)
{
r_matrix_push(NULL);
r_matrix_translate(NULL, x, y, 0);
}
fake_input = *input;
fake_input.pointers = pointers = malloc((sizeof *pointers) * input->pointer_count);
for(i = 0; i < input->pointer_count; i++)
{
pointers[i] = input->pointers[i];
pointers[i].button[0] = !pointers[i].button[0];
pointers[i].last_button[0] = !pointers[i].last_button[0];
}
ring = seduce_popup(&fake_input, element, element, 4, time, TRUE);
free(pointers);
if(input->mode == BAM_DRAW)
r_matrix_pop(NULL);
return ring;
}