mirror of
https://github.com/quelsolaar/MergeSource
synced 2025-02-08 11:08:41 -05:00
1854 lines
49 KiB
C
1854 lines
49 KiB
C
#include <math.h>
|
|
#include <stdlib.h>
|
|
#include "seduce.h"
|
|
#include "s_draw_3d.h"
|
|
|
|
extern SViewData sui_default_view;
|
|
|
|
RMatrix *r_matrix_get();
|
|
extern void seduce_widget_overlay_matrix(RMatrix *matrix);
|
|
extern void seduce_object_3d_draw(BInputState *input, float pos_x, float pos_y, float pos_z, float scale, uint id, float fade, float *color);
|
|
/*
|
|
void seduce_manipulator_matrix_clear_and_clone(RMatrix *matrix, RMatrix *clone)
|
|
{
|
|
uint m[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
|
|
uint i;
|
|
if(clone == NULL)
|
|
clone = r_matrix_get();
|
|
for(i = 0; i < 16; i++)
|
|
{
|
|
matrix->matrix[0][i] = m[i];
|
|
matrix->projection[i] = clone->projection[i];
|
|
}
|
|
matrix->current = 0;
|
|
}*/
|
|
|
|
typedef struct{
|
|
void *id;
|
|
boolean active;
|
|
float timer;
|
|
uint part;
|
|
float grab_pos[3];
|
|
RMatrix matrix;
|
|
}SeduceManipulatorSpaceGrab;
|
|
|
|
boolean seduce_manipulator_point_axis_internal(BInputState *input, SeduceManipulatorSpaceGrab *grab, RMatrix *m, float *pos, void *id, uint part, float *snap, boolean snap_active, uint axis, float scale, float *matrix, uint icon)
|
|
{
|
|
static boolean *a_button = NULL, *a_button_last;
|
|
float tmp[3], f;
|
|
uint i, count, active_pointer = -1, pointer_count, user_count, p;
|
|
|
|
pointer_count = betray_support_functionality(B_SF_POINTER_COUNT_MAX);
|
|
user_count = betray_support_functionality(B_SF_USER_COUNT_MAX);
|
|
|
|
if(a_button == NULL)
|
|
{
|
|
a_button = malloc((sizeof *a_button) * user_count);
|
|
a_button_last = malloc((sizeof *a_button_last) * user_count);
|
|
for(i = 0; i < user_count; i++)
|
|
a_button[i] = a_button_last[i] = FALSE;
|
|
}
|
|
if(input->mode == BAM_DRAW)
|
|
{
|
|
r_matrix_projection_screenf(m, tmp, pos[0], pos[1], pos[2]);
|
|
if(tmp[2] < 0)
|
|
{
|
|
|
|
float color[4] = {0.2, 0.6, 1.0, 1.0};
|
|
static float time = 0;
|
|
boolean active = FALSE;
|
|
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
{
|
|
if((grab[i].id == id && grab[i].active && grab[i].part == part) || (id == seduce_element_pointer_id(input, i, &p) && p == part))
|
|
{
|
|
active = TRUE;
|
|
grab[i].matrix = *m;
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(id == seduce_element_selected_id(i, NULL, &p) && p == part)
|
|
{
|
|
active = TRUE;
|
|
grab[i + pointer_count].matrix = *m;
|
|
}
|
|
}
|
|
r_matrix_push(m);
|
|
r_matrix_translate(m, pos[0], pos[1], pos[2]);
|
|
r_matrix_normalize_scale(m);
|
|
r_matrix_matrix_mult(m, matrix);
|
|
if(active)
|
|
seduce_object_3d_draw(input, 0, 0, 0, scale, icon, 1, color);
|
|
else
|
|
seduce_object_3d_draw(input, 0, 0, 0, scale, icon, 1, NULL);
|
|
r_matrix_pop(m);
|
|
seduce_element_add_point(input, id, part, pos, scale);
|
|
}
|
|
}
|
|
|
|
if(input->mode == BAM_EVENT)
|
|
{
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
{
|
|
if(!input->pointers[i].button[0])
|
|
grab[i].active = FALSE;
|
|
if(grab[i].id == id && grab[i].active && grab[i].part == part)
|
|
{
|
|
if(snap != NULL && snap_active)
|
|
{
|
|
pos[axis] = snap[axis];
|
|
}else
|
|
{
|
|
r_matrix_projection_axisf(&grab[i].matrix, tmp, pos, axis, input->pointers[i].pointer_x, input->pointers[i].pointer_y);
|
|
pos[0] = tmp[0] + grab[i].grab_pos[0];
|
|
pos[1] = tmp[1] + grab[i].grab_pos[1];
|
|
pos[2] = tmp[2] + grab[i].grab_pos[2];
|
|
}
|
|
}else if(!grab[i].active)
|
|
{
|
|
if(input->pointers[i].button[0] && !input->pointers[i].last_button[0])
|
|
{
|
|
if(id == seduce_element_pointer_id(input, i, &p) && p == part)
|
|
{
|
|
grab[i].active = TRUE;
|
|
grab[i].id = id;
|
|
grab[i].part = part;
|
|
grab[i].timer = 0.1;
|
|
r_matrix_projection_axisf(&grab[i].matrix, tmp, pos, axis, input->pointers[i].pointer_x, input->pointers[i].pointer_y);
|
|
grab[i].grab_pos[0] = pos[0] - tmp[0];
|
|
grab[i].grab_pos[1] = pos[1] - tmp[1];
|
|
grab[i].grab_pos[2] = pos[2] - tmp[2];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(id == seduce_element_selected_id(i, NULL, &p) && p == part)
|
|
{
|
|
betray_button_get_up_down(i, &a_button[i], &a_button_last[i], BETRAY_BUTTON_FACE_A);
|
|
if(!a_button[i])
|
|
grab[i + pointer_count].active = FALSE;
|
|
|
|
if(grab[i + pointer_count].id == id && grab[i + pointer_count].active && grab[i + pointer_count].part == part)
|
|
{
|
|
uint a;
|
|
a = seduce_element_primary_axis(input, i);
|
|
if(a != -1)
|
|
{
|
|
r_matrix_projection_screenf(&grab[i + pointer_count].matrix, tmp, pos[0], pos[1], pos[2]);
|
|
tmp[0] += input->axis[a].axis[0] * input->delta_time;
|
|
tmp[1] += input->axis[a].axis[1] * input->delta_time;
|
|
r_matrix_projection_axisf(&grab[i + pointer_count].matrix, tmp, pos, axis, tmp[0], tmp[1]);
|
|
pos[0] = tmp[0];
|
|
pos[1] = tmp[1];
|
|
pos[2] = tmp[2];
|
|
}
|
|
}else if(!grab[i + pointer_count].active)
|
|
{
|
|
if(a_button[i] && !a_button_last[i])
|
|
{
|
|
grab[i + pointer_count].part = part;
|
|
grab[i + pointer_count].active = TRUE;
|
|
grab[i + pointer_count].id = id;
|
|
grab[i + pointer_count].timer = 0.1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for(i = 0; i < (pointer_count + user_count); i++)
|
|
if(grab[i].id == id && grab[i].active && grab[i].part == part)
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
boolean seduce_manipulator_point_plane_internal(BInputState *input, SeduceManipulatorSpaceGrab *grab, RMatrix *m, float *pos, void *id, uint part, float *snap, boolean snap_active, uint axis, float scale, float *matrix, uint icon)
|
|
{
|
|
static boolean *a_button = NULL, *a_button_last;
|
|
float tmp[3], f;
|
|
uint i, count, active_pointer = -1, pointer_count, user_count, p;
|
|
|
|
pointer_count = betray_support_functionality(B_SF_POINTER_COUNT_MAX);
|
|
user_count = betray_support_functionality(B_SF_USER_COUNT_MAX);
|
|
if(a_button == NULL)
|
|
{
|
|
a_button = malloc((sizeof *a_button) * user_count);
|
|
a_button_last = malloc((sizeof *a_button_last) * user_count);
|
|
for(i = 0; i < user_count; i++)
|
|
a_button[i] = a_button_last[i] = FALSE;
|
|
}
|
|
if(input->mode == BAM_DRAW)
|
|
{
|
|
r_matrix_projection_screenf(m, tmp, pos[0], pos[1], pos[2]);
|
|
if(tmp[2] < 0)
|
|
{
|
|
float color[4] = {0.2, 0.6, 1.0, 1.0};
|
|
static float time = 0;
|
|
boolean active = FALSE;
|
|
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
{
|
|
if((grab[i].id == id && grab[i].active && grab[i].part == part) || (id == seduce_element_pointer_id(input, i, &p) && p == part))
|
|
{
|
|
active = TRUE;
|
|
grab[i].matrix = *m;
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(id == seduce_element_selected_id(i, NULL, &p) && p == part)
|
|
{
|
|
active = TRUE;
|
|
grab[i + pointer_count].matrix = *m;
|
|
}
|
|
}
|
|
r_matrix_push(m);
|
|
r_matrix_translate(m, pos[0], pos[1], pos[2]);
|
|
r_matrix_normalize_scale(m);
|
|
r_matrix_matrix_mult(m, matrix);
|
|
if(active)
|
|
seduce_object_3d_draw(input, 0, 0, 0, scale, icon, 1, color);
|
|
else
|
|
seduce_object_3d_draw(input, 0, 0, 0, scale, icon, 1, NULL);
|
|
r_matrix_pop(m);
|
|
seduce_element_add_point(input, id, part, pos, scale);
|
|
}
|
|
}
|
|
|
|
if(input->mode == BAM_EVENT)
|
|
{
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
{
|
|
if(!input->pointers[i].button[0])
|
|
grab[i].active = FALSE;
|
|
if(grab[i].id == id && grab[i].active && grab[i].part == part)
|
|
{
|
|
if(snap != NULL && snap_active)
|
|
{
|
|
pos[(axis + 1) % 3] = snap[(axis + 1) % 3];
|
|
pos[(axis + 2) % 3] = snap[(axis + 2) % 3];
|
|
}else
|
|
{
|
|
if(r_matrix_projection_surfacef(&grab[i].matrix, tmp, pos, axis, input->pointers[i].pointer_x, input->pointers[i].pointer_y))
|
|
{
|
|
pos[0] = tmp[0] + grab[i].grab_pos[0];
|
|
pos[1] = tmp[1] + grab[i].grab_pos[1];
|
|
pos[2] = tmp[2] + grab[i].grab_pos[2];
|
|
}
|
|
}
|
|
}else if(!grab[i].active)
|
|
{
|
|
if(input->pointers[i].button[0] && !input->pointers[i].last_button[0])
|
|
{
|
|
if(id == seduce_element_pointer_id(input, i, &p) && part == p)
|
|
{
|
|
if(r_matrix_projection_surfacef(&grab[i].matrix, tmp, pos, axis, input->pointers[i].pointer_x, input->pointers[i].pointer_y))
|
|
{
|
|
grab[i].active = TRUE;
|
|
grab[i].id = id;
|
|
grab[i].part = part;
|
|
grab[i].timer = 0.1;
|
|
grab[i].grab_pos[0] = pos[0] - tmp[0];
|
|
grab[i].grab_pos[1] = pos[1] - tmp[1];
|
|
grab[i].grab_pos[2] = pos[2] - tmp[2];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(id == seduce_element_selected_id(i, NULL, &p) && p == part)
|
|
{
|
|
betray_button_get_up_down(i, &a_button[i], &a_button_last[i], BETRAY_BUTTON_FACE_A);
|
|
if(!a_button[i])
|
|
grab[i + pointer_count].active = FALSE;
|
|
|
|
if(grab[i + pointer_count].id == id && grab[i + pointer_count].part == part && grab[i + pointer_count].active)
|
|
{
|
|
uint a;
|
|
a = seduce_element_primary_axis(input, i);
|
|
if(a != -1)
|
|
{
|
|
r_matrix_projection_screenf(&grab[i + pointer_count].matrix, tmp, pos[0], pos[1], pos[2]);
|
|
tmp[0] += input->axis[a].axis[0] * input->delta_time;
|
|
tmp[1] += input->axis[a].axis[1] * input->delta_time;
|
|
if(r_matrix_projection_surfacef(&grab[i + pointer_count].matrix, tmp, pos, axis, tmp[0], tmp[1]))
|
|
{
|
|
pos[0] = tmp[0];
|
|
pos[1] = tmp[1];
|
|
pos[2] = tmp[2];
|
|
}
|
|
}
|
|
}else if(!grab[i + pointer_count].active)
|
|
{
|
|
if(a_button[i] && !a_button_last[i])
|
|
{
|
|
grab[i + pointer_count].active = TRUE;
|
|
grab[i + pointer_count].id = id;
|
|
grab[i + pointer_count].part = part;
|
|
grab[i + pointer_count].timer = 0.1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for(i = 0; i < (pointer_count + user_count); i++)
|
|
if(grab[i].id == id && grab[i].active && grab[i].part == part)
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
boolean seduce_manipulator_point_pos_internal(BInputState *input, SeduceManipulatorSpaceGrab *grab, RMatrix *m, float *pos, void *id, uint part, float *snap, boolean snap_active, float scale, float *matrix, uint icon)
|
|
{
|
|
static boolean *a_button = NULL, *a_button_last;
|
|
float tmp[3], f;
|
|
uint i, count, active_pointer = -1, pointer_count, user_count, p;
|
|
|
|
pointer_count = betray_support_functionality(B_SF_POINTER_COUNT_MAX);
|
|
user_count = betray_support_functionality(B_SF_USER_COUNT_MAX);
|
|
if(a_button == NULL)
|
|
{
|
|
a_button = malloc((sizeof *a_button) * user_count);
|
|
a_button_last = malloc((sizeof *a_button_last) * user_count);
|
|
for(i = 0; i < user_count; i++)
|
|
a_button[i] = a_button_last[i] = FALSE;
|
|
}
|
|
if(input->mode == BAM_DRAW)
|
|
{
|
|
r_matrix_projection_screenf(m, tmp, pos[0], pos[1], pos[2]);
|
|
if(tmp[2] < 0)
|
|
{
|
|
float color[4] = {0.2, 0.6, 1.0, 1.0};
|
|
static float time = 0;
|
|
boolean active = FALSE;
|
|
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
{
|
|
if((grab[i].id == id && grab[i].active && grab[i].part == part) || (id == seduce_element_pointer_id(input, i, &p) && p == part))
|
|
{
|
|
active = TRUE;
|
|
grab[i].matrix = *m;
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(id == seduce_element_selected_id(i, NULL, &p) && p == part)
|
|
{
|
|
active = TRUE;
|
|
grab[i + pointer_count].matrix = *m;
|
|
}
|
|
}
|
|
r_matrix_push(m);
|
|
r_matrix_translate(m, pos[0], pos[1], pos[2]);
|
|
r_matrix_normalize_scale(m);
|
|
r_matrix_matrix_mult(m, matrix);
|
|
if(active)
|
|
seduce_object_3d_draw(input, 0, 0, 0, scale, icon, 1, color);
|
|
else
|
|
seduce_object_3d_draw(input, 0, 0, 0, scale, icon, 1, NULL);
|
|
r_matrix_pop(m);
|
|
seduce_element_add_point(input, id, part, pos, scale);
|
|
}
|
|
|
|
}
|
|
|
|
if(input->mode == BAM_EVENT)
|
|
{
|
|
for(i = 0; i < input->pointer_count; i++)
|
|
{
|
|
if(!input->pointers[i].button[0])
|
|
grab[i].active = FALSE;
|
|
if(grab[i].id == id && grab[i].active && grab[i].part == part)
|
|
{
|
|
if(snap != NULL && snap_active)
|
|
{
|
|
pos[0] = snap[0];
|
|
pos[1] = snap[1];
|
|
pos[2] = snap[2];
|
|
}else
|
|
{
|
|
r_matrix_projection_vertexf(&grab[i].matrix, tmp, pos, input->pointers[i].pointer_x, input->pointers[i].pointer_y);
|
|
pos[0] = tmp[0] + grab[i].grab_pos[0];
|
|
pos[1] = tmp[1] + grab[i].grab_pos[1];
|
|
pos[2] = tmp[2] + grab[i].grab_pos[2];
|
|
}
|
|
}else if(!grab[i].active)
|
|
{
|
|
if(input->pointers[i].button[0] && !input->pointers[i].last_button[0])
|
|
{
|
|
if(id == seduce_element_pointer_id(input, i, &p) && part == p)
|
|
{
|
|
grab[i].active = TRUE;
|
|
grab[i].id = id;
|
|
grab[i].part = part;
|
|
grab[i].timer = 0.1;
|
|
r_matrix_projection_vertexf(&grab[i].matrix, tmp, pos, input->pointers[i].pointer_x, input->pointers[i].pointer_y);
|
|
grab[i].grab_pos[0] = pos[0] - tmp[0];
|
|
grab[i].grab_pos[1] = pos[1] - tmp[1];
|
|
grab[i].grab_pos[2] = pos[2] - tmp[2];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for(i = 0; i < input->user_count; i++)
|
|
{
|
|
if(id == seduce_element_selected_id(i, NULL, &p) && p == part)
|
|
{
|
|
betray_button_get_up_down(i, &a_button[i], &a_button_last[i], BETRAY_BUTTON_FACE_A);
|
|
if(!a_button[i])
|
|
grab[i + pointer_count].active = FALSE;
|
|
|
|
if(grab[i + pointer_count].id == id && grab[i + pointer_count].part == part && grab[i + pointer_count].active)
|
|
{
|
|
uint a;
|
|
a = seduce_element_primary_axis(input, i);
|
|
if(a != -1)
|
|
{
|
|
r_matrix_projection_screenf(&grab[i + pointer_count].matrix, tmp, pos[0], pos[1], pos[2]);
|
|
tmp[0] += input->axis[a].axis[0] * input->delta_time;
|
|
tmp[1] += input->axis[a].axis[1] * input->delta_time;
|
|
r_matrix_projection_worldf(&grab[i + pointer_count].matrix, tmp, tmp[0], tmp[1], tmp[2]);
|
|
pos[0] = tmp[0];
|
|
pos[1] = tmp[1];
|
|
pos[2] = tmp[2];
|
|
}
|
|
}else if(!grab[i + pointer_count].active)
|
|
{
|
|
if(a_button[i] && !a_button_last[i])
|
|
{
|
|
grab[i + pointer_count].active = TRUE;
|
|
grab[i + pointer_count].id = id;
|
|
grab[i + pointer_count].part = part;
|
|
grab[i + pointer_count].timer = 0.1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for(i = 0; i < (pointer_count + user_count); i++)
|
|
if(grab[i].id == id && grab[i].active && grab[i].part == part)
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
boolean seduce_manipulator_square_centered(BInputState *input, RMatrix *m, float *pos, float *size, void *id, float *snap, boolean snap_active, boolean aspect_lock, float scale, float time)
|
|
{
|
|
static SeduceManipulatorSpaceGrab *grab = NULL;
|
|
static uint frame_id = -1;
|
|
uint i, count, pointer_count, user_count;
|
|
float tmp[3], matrix[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
|
|
boolean output = FALSE;
|
|
RMatrix *reset;
|
|
if(m == NULL)
|
|
m = r_matrix_get();
|
|
|
|
|
|
pointer_count = betray_support_functionality(B_SF_POINTER_COUNT_MAX);
|
|
user_count = betray_support_functionality(B_SF_USER_COUNT_MAX);
|
|
|
|
if(grab == NULL)
|
|
{
|
|
count = betray_support_functionality(B_SF_USER_COUNT_MAX);
|
|
count += betray_support_functionality(B_SF_POINTER_COUNT_MAX);
|
|
grab = malloc((sizeof *grab) * count);
|
|
for(i = 0; i < count; i++)
|
|
{
|
|
grab[i].id = NULL;
|
|
r_matrix_identity(&grab[i].matrix);
|
|
}
|
|
}
|
|
|
|
if(input->mode == BAM_DRAW)
|
|
{
|
|
reset = r_matrix_get();
|
|
r_matrix_set(m);
|
|
r_matrix_projection_screenf(m, tmp, pos[0], pos[1], pos[2]);
|
|
scale *= -tmp[2] * 0.025;
|
|
}else
|
|
{
|
|
for(i = 0; i < pointer_count + user_count && grab[i].id != id; i++);
|
|
if(i < pointer_count + user_count)
|
|
r_matrix_projection_screenf(&grab[i].matrix, tmp, pos[0], pos[1], pos[2]);
|
|
else
|
|
r_matrix_projection_screenf(m, tmp, pos[0], pos[1], pos[2]);
|
|
}
|
|
|
|
time = (1.0 - time);
|
|
time = time * time * 0.3 * -tmp[2];
|
|
tmp[0] = pos[0] + size[0] + time;
|
|
tmp[1] = pos[1];
|
|
tmp[2] = pos[2];
|
|
matrix[0] = 0;
|
|
matrix[1] = 1;
|
|
matrix[4] = -1;
|
|
matrix[5] = 0;
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 0, snap, snap_active, 0, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_2D))
|
|
{
|
|
if(aspect_lock)
|
|
{
|
|
size[1] *= (tmp[0] - pos[0]) / size[0];
|
|
size[0] = tmp[0] - pos[0];
|
|
}else
|
|
size[0] = tmp[0] - pos[0];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = pos[0] - size[0] - time;
|
|
tmp[1] = pos[1];
|
|
tmp[2] = pos[2];
|
|
matrix[0] = 0;
|
|
matrix[1] = -1;
|
|
matrix[4] = 1;
|
|
matrix[5] = 0;
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 1, snap, snap_active, 0, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_2D))
|
|
{
|
|
if(aspect_lock)
|
|
{
|
|
size[1] *= (pos[0] - tmp[0]) / size[0];
|
|
size[0] = pos[0] - tmp[0];
|
|
}else
|
|
size[0] = pos[0] - tmp[0];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = pos[0];
|
|
tmp[1] = pos[1] + size[1] + time;
|
|
tmp[2] = pos[2];
|
|
matrix[0] = 1;
|
|
matrix[1] = 0;
|
|
matrix[4] = 0;
|
|
matrix[5] = -1;
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 2, snap, snap_active, 1, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_2D))
|
|
{
|
|
if(aspect_lock)
|
|
{
|
|
size[0] *= (tmp[1] - pos[1]) / size[1];
|
|
size[1] = tmp[1] - pos[1];
|
|
}else
|
|
size[1] = tmp[1] - pos[1];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = pos[0];
|
|
tmp[1] = pos[1] - size[1] - time;
|
|
tmp[2] = pos[2];
|
|
matrix[0] = 1;
|
|
matrix[1] = 0;
|
|
matrix[4] = 0;
|
|
matrix[5] = 1;
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 3, snap, snap_active, 1, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_2D))
|
|
{
|
|
if(aspect_lock)
|
|
{
|
|
size[0] *= (pos[1] - tmp[1]) / size[1];
|
|
size[1] = pos[1] - tmp[1];
|
|
}else
|
|
size[1] = pos[1] - tmp[1];
|
|
output = TRUE;
|
|
}
|
|
|
|
if(!aspect_lock)
|
|
{
|
|
tmp[0] = pos[0] + size[0] + time;
|
|
tmp[1] = pos[1] + size[1] + time;
|
|
tmp[2] = pos[2];
|
|
matrix[0] = 0;
|
|
matrix[1] = -1;
|
|
matrix[4] = -1;
|
|
matrix[5] = 0;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 4, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_CORNER_2D))
|
|
{
|
|
size[0] = tmp[0] - pos[0];
|
|
size[1] = tmp[1] - pos[1];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = pos[0] - size[0] - time;
|
|
tmp[1] = pos[1] + size[1] + time;
|
|
tmp[2] = pos[2];
|
|
matrix[0] = 0;
|
|
matrix[1] = -1;
|
|
matrix[4] = 1;
|
|
matrix[5] = 0;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 5, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_CORNER_2D))
|
|
{
|
|
size[0] = pos[0] - tmp[0];
|
|
size[1] = tmp[1] - pos[1];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = pos[0] - size[0] - time;
|
|
tmp[1] = pos[1] - size[1] - time;
|
|
tmp[2] = pos[2];
|
|
matrix[0] = 1;
|
|
matrix[1] = 0;
|
|
matrix[4] = 0;
|
|
matrix[5] = 1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 6, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_CORNER_2D))
|
|
{
|
|
size[0] = pos[0] - tmp[0];
|
|
size[1] = pos[1] - tmp[1];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = pos[0] + size[0] + time;
|
|
tmp[1] = pos[1] - size[1] - time;
|
|
tmp[2] = pos[2];
|
|
matrix[0] = -1;
|
|
matrix[1] = 0;
|
|
matrix[4] = 0;
|
|
matrix[5] = 1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 7, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_CORNER_2D))
|
|
{
|
|
size[0] = tmp[0] - pos[0];
|
|
size[1] = pos[1] - tmp[1];
|
|
output = TRUE;
|
|
}
|
|
}
|
|
if(size[0] < 0)
|
|
{
|
|
size[0] = -size[0];
|
|
for(i = 0; i < pointer_count + user_count; i++)
|
|
{
|
|
if(grab[i].id == id)
|
|
{
|
|
if(grab[i].part == 0)
|
|
grab[i].part = 1;
|
|
else if(grab[i].part == 1)
|
|
grab[i].part = 0;
|
|
else if(grab[i].part == 4)
|
|
grab[i].part = 5;
|
|
else if(grab[i].part == 5)
|
|
grab[i].part = 4;
|
|
else if(grab[i].part == 6)
|
|
grab[i].part = 7;
|
|
else if(grab[i].part == 7)
|
|
grab[i].part = 6;
|
|
}
|
|
}
|
|
}
|
|
if(size[1] < 0)
|
|
{
|
|
size[1] = -size[1];
|
|
for(i = 0; i < pointer_count + user_count; i++)
|
|
{
|
|
if(grab[i].id == id)
|
|
{
|
|
if(grab[i].part == 2)
|
|
grab[i].part = 3;
|
|
else if(grab[i].part == 3)
|
|
grab[i].part = 2;
|
|
else if(grab[i].part == 4)
|
|
grab[i].part = 6;
|
|
else if(grab[i].part == 6)
|
|
grab[i].part = 4;
|
|
else if(grab[i].part == 5)
|
|
grab[i].part = 7;
|
|
else if(grab[i].part == 7)
|
|
grab[i].part = 5;
|
|
}
|
|
}
|
|
}
|
|
if(input->mode == BAM_MAIN && frame_id != input->frame_number)
|
|
{
|
|
frame_id = input->frame_number;
|
|
for(i = 0; i < (pointer_count + user_count); i++)
|
|
{
|
|
if(grab[i].active)
|
|
{
|
|
grab[i].timer += input->delta_time * 2.5;
|
|
if(grab[i].timer > 1.0)
|
|
grab[i].timer = 1.0;
|
|
}else
|
|
grab[i].timer -= input->delta_time * 2.5;
|
|
}
|
|
}
|
|
if(input->mode == BAM_DRAW)
|
|
r_matrix_set(reset);
|
|
return output;
|
|
}
|
|
|
|
|
|
boolean seduce_manipulator_square_cornered(BInputState *input, RMatrix *m, float *down_left, float *up_right, void *id, float *snap, boolean snap_active, boolean aspect_lock, float scale, float time)
|
|
{
|
|
static SeduceManipulatorSpaceGrab *grab = NULL;
|
|
static uint frame_id = -1;
|
|
uint i, count, pointer_count, user_count;
|
|
float f, size, tmp[3], matrix[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
|
|
boolean output = FALSE;
|
|
RMatrix *reset;
|
|
if(m == NULL)
|
|
m = r_matrix_get();
|
|
if(input->mode == BAM_DRAW)
|
|
{
|
|
reset = r_matrix_get();
|
|
r_matrix_set(m);
|
|
}
|
|
|
|
r_matrix_projection_screenf(m, tmp, (down_left[0] + up_right[0]) * 0.5, (down_left[1] + up_right[1]) * 0.5, (down_left[2] + up_right[2]) * 0.5);
|
|
scale *= -tmp[2] * 0.025;
|
|
|
|
pointer_count = betray_support_functionality(B_SF_POINTER_COUNT_MAX);
|
|
user_count = betray_support_functionality(B_SF_USER_COUNT_MAX);
|
|
|
|
if(grab == NULL)
|
|
{
|
|
count = betray_support_functionality(B_SF_USER_COUNT_MAX);
|
|
count += betray_support_functionality(B_SF_POINTER_COUNT_MAX);
|
|
grab = malloc((sizeof *grab) * count);
|
|
for(i = 0; i < count; i++)
|
|
{
|
|
grab[i].id = NULL;
|
|
r_matrix_identity(&grab[i].matrix);
|
|
}
|
|
}
|
|
|
|
time = (1.0 - time);
|
|
time = time * time * 0.3 * -tmp[2];
|
|
tmp[0] = up_right[0] + time;
|
|
tmp[1] = (down_left[1] + up_right[1]) * 0.5;
|
|
tmp[2] = down_left[2];
|
|
matrix[0] = 0;
|
|
matrix[1] = 1;
|
|
matrix[4] = -1;
|
|
matrix[5] = 0;
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 0, snap, snap_active, 0, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_2D))
|
|
{
|
|
if(aspect_lock)
|
|
{
|
|
/* size = (up_right[1] - down_left[1]) / (up_right[0] - down_left[0]);
|
|
size = (tmp[0] - down_left[0]) * size * 0.5;
|
|
if(size < 0)
|
|
size = -size;
|
|
f = (down_left[1] + up_right[1]) * 0.5;
|
|
down_left[1] = f - size;
|
|
up_right[1] = f + size;*/
|
|
}
|
|
up_right[0] = tmp[0];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = down_left[0] - time;
|
|
tmp[1] = (down_left[1] + up_right[1]) * 0.5;
|
|
tmp[2] = down_left[2];
|
|
matrix[0] = 0;
|
|
matrix[1] = -1;
|
|
matrix[4] = 1;
|
|
matrix[5] = 0;
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 1, snap, snap_active, 0, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_2D))
|
|
{
|
|
if(aspect_lock)
|
|
{
|
|
/* size = (up_right[1] - down_left[1]) / (up_right[0] - down_left[0]);
|
|
size = (up_right[0] - tmp[0]) * size * 0.5;
|
|
if(size < 0)
|
|
size = -size;
|
|
f = (down_left[1] + up_right[1]) * 0.5;
|
|
down_left[1] = f - size;
|
|
up_right[1] = f + size;*/
|
|
}
|
|
down_left[0] = tmp[0];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = (down_left[0] + up_right[0]) * 0.5;
|
|
tmp[1] = up_right[1] + time;
|
|
tmp[2] = down_left[2];
|
|
matrix[0] = 1;
|
|
matrix[1] = 0;
|
|
matrix[4] = 0;
|
|
matrix[5] = -1;
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 2, snap, snap_active, 1, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_2D))
|
|
{
|
|
/* if(aspect_lock)
|
|
{
|
|
size = up_right[1] - down_left[1];
|
|
f = (down_left[1] + up_right[1]) * 0.5;
|
|
down_left[1] = f - size * tmp[0] / up_right[0] * 0.5;
|
|
up_right[1] = f + size * tmp[0] / up_right[0] * 0.5;
|
|
}*/
|
|
up_right[1] = tmp[1];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = (down_left[0] + up_right[0]) * 0.5;
|
|
tmp[1] = down_left[1] - time;
|
|
tmp[2] = down_left[2];
|
|
matrix[0] = 1;
|
|
matrix[1] = 0;
|
|
matrix[4] = 0;
|
|
matrix[5] = 1;
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 3, snap, snap_active, 1, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_2D))
|
|
{
|
|
/* if(aspect_lock)
|
|
{
|
|
size = up_right[1] - down_left[1];
|
|
f = (down_left[1] + up_right[1]) * 0.5;
|
|
down_left[1] = f - size * tmp[0] / up_right[0] * 0.5;
|
|
up_right[1] = f + size * tmp[0] / up_right[0] * 0.5;
|
|
}*/
|
|
down_left[1] = tmp[1];
|
|
output = TRUE;
|
|
}
|
|
|
|
if(!aspect_lock)
|
|
{
|
|
tmp[0] = up_right[0] + time;
|
|
tmp[1] = up_right[1] + time;
|
|
tmp[2] = up_right[2];
|
|
matrix[0] = 0;
|
|
matrix[1] = -1;
|
|
matrix[4] = -1;
|
|
matrix[5] = 0;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 4, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_CORNER_2D))
|
|
{
|
|
up_right[0] = tmp[0];
|
|
up_right[1] = tmp[1];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = down_left[0] - time;
|
|
tmp[1] = up_right[1] + time;
|
|
tmp[2] = up_right[2];
|
|
matrix[0] = 0;
|
|
matrix[1] = -1;
|
|
matrix[4] = 1;
|
|
matrix[5] = 0;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 5, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_CORNER_2D))
|
|
{
|
|
down_left[0] = tmp[0];
|
|
up_right[1] = tmp[1];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = down_left[0] - time;
|
|
tmp[1] = down_left[1] - time;
|
|
tmp[2] = up_right[2];
|
|
matrix[0] = 1;
|
|
matrix[1] = 0;
|
|
matrix[4] = 0;
|
|
matrix[5] = 1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 6, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_CORNER_2D))
|
|
{
|
|
down_left[0] = tmp[0];
|
|
down_left[1] = tmp[1];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = up_right[0] + time;
|
|
tmp[1] = down_left[1] - time;
|
|
tmp[2] = up_right[2];
|
|
matrix[0] = -1;
|
|
matrix[1] = 0;
|
|
matrix[4] = 0;
|
|
matrix[5] = 1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 7, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_CORNER_2D))
|
|
{
|
|
up_right[0] = tmp[0];
|
|
down_left[1] = tmp[1];
|
|
output = TRUE;
|
|
}
|
|
}
|
|
if(up_right[0] < down_left[0])
|
|
{
|
|
f = up_right[0];
|
|
up_right[0] = down_left[0];
|
|
down_left[0] = up_right[0];
|
|
for(i = 0; i < pointer_count + user_count; i++)
|
|
{
|
|
if(grab[i].id == id)
|
|
{
|
|
if(grab[i].part == 0)
|
|
grab[i].part = 1;
|
|
else if(grab[i].part == 1)
|
|
grab[i].part = 0;
|
|
else if(grab[i].part == 4)
|
|
grab[i].part = 5;
|
|
else if(grab[i].part == 5)
|
|
grab[i].part = 4;
|
|
else if(grab[i].part == 6)
|
|
grab[i].part = 7;
|
|
else if(grab[i].part == 7)
|
|
grab[i].part = 6;
|
|
}
|
|
}
|
|
}
|
|
if(up_right[1] < down_left[1])
|
|
{
|
|
f = up_right[1];
|
|
up_right[1] = down_left[1];
|
|
down_left[1] = up_right[1];
|
|
for(i = 0; i < pointer_count + user_count; i++)
|
|
{
|
|
if(grab[i].id == id)
|
|
{
|
|
if(grab[i].part == 2)
|
|
grab[i].part = 3;
|
|
else if(grab[i].part == 3)
|
|
grab[i].part = 2;
|
|
else if(grab[i].part == 4)
|
|
grab[i].part = 7;
|
|
else if(grab[i].part == 7)
|
|
grab[i].part = 4;
|
|
else if(grab[i].part == 5)
|
|
grab[i].part = 6;
|
|
else if(grab[i].part == 6)
|
|
grab[i].part = 5;
|
|
}
|
|
}
|
|
}
|
|
if(input->mode == BAM_MAIN && frame_id != input->frame_number)
|
|
{
|
|
frame_id = input->frame_number;
|
|
for(i = 0; i < (pointer_count + user_count); i++)
|
|
{
|
|
if(grab[i].active)
|
|
{
|
|
grab[i].timer += input->delta_time * 2.5;
|
|
if(grab[i].timer > 1.0)
|
|
grab[i].timer = 1.0;
|
|
}else
|
|
grab[i].timer -= input->delta_time * 2.5;
|
|
}
|
|
}
|
|
if(input->mode == BAM_DRAW)
|
|
r_matrix_set(reset);
|
|
return output;
|
|
}
|
|
|
|
boolean seduce_manipulator_cube_centered(BInputState *input, RMatrix *m, float *pos, float *size, void *id, float *snap, boolean snap_active, float scale, float time)
|
|
{
|
|
static SeduceManipulatorSpaceGrab *grab = NULL;
|
|
static uint frame_id = -1;
|
|
uint i, count, pointer_count, user_count;
|
|
float tmp[3], matrix[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}, origo[3] = {0, 0, 0};
|
|
boolean output = FALSE;
|
|
RMatrix *reset;
|
|
if(m == NULL)
|
|
m = r_matrix_get();
|
|
if(pos == NULL)
|
|
pos = origo;
|
|
|
|
pointer_count = betray_support_functionality(B_SF_POINTER_COUNT_MAX);
|
|
user_count = betray_support_functionality(B_SF_USER_COUNT_MAX);
|
|
|
|
if(grab == NULL)
|
|
{
|
|
count = betray_support_functionality(B_SF_USER_COUNT_MAX);
|
|
count += betray_support_functionality(B_SF_POINTER_COUNT_MAX);
|
|
grab = malloc((sizeof *grab) * count);
|
|
for(i = 0; i < count; i++)
|
|
{
|
|
grab[i].id = NULL;
|
|
r_matrix_identity(&grab[i].matrix);
|
|
}
|
|
}
|
|
if(input->mode == BAM_DRAW)
|
|
{
|
|
reset = r_matrix_get();
|
|
r_matrix_set(m);
|
|
r_matrix_projection_screenf(m, tmp, pos[0], pos[1], pos[2]);
|
|
scale *= -tmp[2] * 0.01;
|
|
}else
|
|
{
|
|
for(i = 0; i < pointer_count + user_count && grab[i].id != id; i++);
|
|
if(i < pointer_count + user_count)
|
|
r_matrix_projection_screenf(&grab[i].matrix, tmp, pos[0], pos[1], pos[2]);
|
|
else
|
|
r_matrix_projection_screenf(m, tmp, pos[0], pos[1], pos[2]);
|
|
}
|
|
|
|
|
|
time = (1.0 - time);
|
|
time = time * time * 0.3 * -tmp[2];
|
|
tmp[0] = pos[0] + size[0] + time;
|
|
tmp[1] = pos[1];
|
|
tmp[2] = pos[2];
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 0, snap, snap_active, 0, scale, matrix, SUI_3D_OBJECT_HANDLE_SURF_3D))
|
|
{
|
|
size[0] = tmp[0] - pos[0];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = pos[0] - size[0] - time;
|
|
tmp[1] = pos[1];
|
|
tmp[2] = pos[2];
|
|
|
|
matrix[0] = -1;
|
|
matrix[5] = -1;
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 1, snap, snap_active, 0, scale, matrix, SUI_3D_OBJECT_HANDLE_SURF_3D))
|
|
{
|
|
size[0] = pos[0] - tmp[0];
|
|
output = TRUE;
|
|
}
|
|
|
|
tmp[0] = pos[0];
|
|
tmp[1] = pos[1] + size[1] + time;
|
|
tmp[2] = pos[2];
|
|
matrix[0] = 0;
|
|
matrix[1] = 1;
|
|
matrix[4] = 1;
|
|
matrix[5] = 0;
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 2, snap, snap_active, 1, scale, matrix, SUI_3D_OBJECT_HANDLE_SURF_3D))
|
|
{
|
|
size[1] = tmp[1] - pos[1];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = pos[0];
|
|
tmp[1] = pos[1] - size[1] - time;
|
|
tmp[2] = pos[2];
|
|
matrix[1] = -1;
|
|
matrix[4] = -1;
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 3, snap, snap_active, 1, scale, matrix, SUI_3D_OBJECT_HANDLE_SURF_3D))
|
|
{
|
|
size[1] = pos[1] - tmp[1];
|
|
output = TRUE;
|
|
}
|
|
|
|
|
|
tmp[0] = pos[0];
|
|
tmp[1] = pos[1];
|
|
tmp[2] = pos[2] + size[2] + time;
|
|
matrix[1] = 0;
|
|
matrix[4] = 0;
|
|
matrix[2] = 1;
|
|
matrix[5] = 1;
|
|
matrix[8] = 1;
|
|
matrix[10] = 0;
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 4, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_SURF_3D))
|
|
{
|
|
size[2] = tmp[2] - pos[2];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = pos[0];
|
|
tmp[1] = pos[1];
|
|
tmp[2] = pos[2] - size[2] - time;
|
|
matrix[2] = -1;
|
|
matrix[5] = 1;
|
|
matrix[8] = -1;
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 5, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_SURF_3D))
|
|
{
|
|
size[2] = pos[2] - tmp[2];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = pos[0] + size[0] + time;
|
|
tmp[1] = pos[1] + size[1] + time;
|
|
tmp[2] = pos[2];
|
|
matrix[0] = 1;
|
|
matrix[5] = 0;
|
|
matrix[6] = 1;
|
|
matrix[2] = 0;
|
|
matrix[8] = 0;
|
|
matrix[9] = 1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 6, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
size[0] = tmp[0] - pos[0];
|
|
size[1] = tmp[1] - pos[1];
|
|
output = TRUE;
|
|
}
|
|
|
|
tmp[0] = pos[0] - size[0] - time;
|
|
tmp[1] = pos[1] + size[1] + time;
|
|
tmp[2] = pos[2];
|
|
matrix[0] = -1;
|
|
matrix[6] = 1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 7, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
size[0] = pos[0] - tmp[0];
|
|
size[1] = tmp[1] - pos[1];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = pos[0] - size[0] - time;
|
|
tmp[1] = pos[1] - size[1] - time;
|
|
tmp[2] = pos[2];
|
|
matrix[0] = -1;
|
|
matrix[6] = 1;
|
|
matrix[9] = -1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 8, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
size[0] = pos[0] - tmp[0];
|
|
size[1] = pos[1] - tmp[1];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = pos[0] + size[0] + time;
|
|
tmp[1] = pos[1] - size[1] - time;
|
|
tmp[2] = pos[2];
|
|
matrix[0] = 1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 9, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
size[0] = tmp[0] - pos[0];
|
|
size[1] = pos[1] - tmp[1];
|
|
output = TRUE;
|
|
}
|
|
|
|
tmp[0] = pos[0] + size[0] + time;
|
|
tmp[1] = pos[1];
|
|
tmp[2] = pos[2] + size[2] + time;
|
|
matrix[0] = 0;
|
|
matrix[5] = 1;
|
|
matrix[6] = 0;
|
|
matrix[2] = 1;
|
|
matrix[8] = 1;
|
|
matrix[9] = 0;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 10, snap, snap_active, 1, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
size[0] = tmp[0] - pos[0];
|
|
size[2] = tmp[2] - pos[2];
|
|
output = TRUE;
|
|
}
|
|
|
|
tmp[0] = pos[0] - size[0] + time;
|
|
tmp[1] = pos[1];
|
|
tmp[2] = pos[2] + size[2] + time;
|
|
matrix[5] = 1;
|
|
matrix[2] = 1;
|
|
matrix[8] = -1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 11, snap, snap_active, 1, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
size[0] = pos[0] - tmp[0];
|
|
size[2] = tmp[2] - pos[2];
|
|
output = TRUE;
|
|
}
|
|
|
|
tmp[0] = pos[0] + size[0] + time;
|
|
tmp[1] = pos[1];
|
|
tmp[2] = pos[2] - size[2] + time;
|
|
|
|
matrix[5] = 1;
|
|
matrix[2] = -1;
|
|
matrix[8] = 1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 12, snap, snap_active, 1, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
size[0] = tmp[0] - pos[0];
|
|
size[2] = pos[2] - tmp[2];
|
|
output = TRUE;
|
|
}
|
|
|
|
tmp[0] = pos[0] - size[0] + time;
|
|
tmp[1] = pos[1];
|
|
tmp[2] = pos[2] - size[2] + time;
|
|
matrix[5] = 1;
|
|
matrix[2] = -1;
|
|
matrix[8] = -1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 13, snap, snap_active, 1, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
size[0] = pos[0] - tmp[0];
|
|
size[2] = pos[2] - tmp[2];
|
|
output = TRUE;
|
|
}
|
|
|
|
|
|
tmp[0] = pos[0];
|
|
tmp[1] = pos[1] + size[1] + time;
|
|
tmp[2] = pos[2] + size[2] + time;
|
|
|
|
matrix[1] = 1;
|
|
matrix[2] = 0;
|
|
matrix[4] = 1;
|
|
matrix[5] = 0;
|
|
matrix[8] = 0;
|
|
matrix[10] = 1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 14, snap, snap_active, 0, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
size[1] = tmp[1] - pos[1];
|
|
size[2] = tmp[2] - pos[2];
|
|
output = TRUE;
|
|
}
|
|
|
|
tmp[0] = pos[0];
|
|
tmp[1] = pos[1] - size[1] - time;
|
|
tmp[2] = pos[2] + size[2] + time;
|
|
matrix[1] = -1;
|
|
matrix[4] = 1;
|
|
matrix[10] = 1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 15, snap, snap_active, 0, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
size[1] = pos[1] - tmp[1];
|
|
size[2] = tmp[2] - pos[2];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = pos[0];
|
|
tmp[1] = pos[1] + size[1] + time;
|
|
tmp[2] = pos[2] - size[2] - time;
|
|
matrix[1] = 1;
|
|
matrix[4] = 1;
|
|
matrix[10] = -1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 16, snap, snap_active, 0, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
size[1] = tmp[1] - pos[1];
|
|
size[2] = pos[2] - tmp[2];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = pos[0];
|
|
tmp[1] = pos[1] - size[1] - time;
|
|
tmp[2] = pos[2] - size[2] - time;
|
|
matrix[1] = -1;
|
|
matrix[4] = 1;
|
|
matrix[10] = -1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 17, snap, snap_active, 0, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
size[1] = pos[1] - tmp[1];
|
|
size[2] = pos[2] - tmp[2];
|
|
output = TRUE;
|
|
}
|
|
matrix[1] = 0;
|
|
matrix[4] = 0;
|
|
matrix[8] = 0;
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
matrix[0] = tmp[0] = (float)(i % 2) * 2.0 - 1.0;
|
|
matrix[5] = tmp[1] = (float)((i / 2) % 2) * -2.0 + 1.0;
|
|
matrix[10] = tmp[2] = (float)((i / 4) % 2) * 2.0 - 1.0;
|
|
tmp[0] = pos[0] + (size[0] + time) * tmp[0];
|
|
tmp[1] = pos[1] + (size[1] + time) * -tmp[1];
|
|
tmp[2] = pos[2] + (size[2] + time) * tmp[2];
|
|
if(seduce_manipulator_point_pos_internal(input, grab, m, tmp, id, 18 + i, snap, snap_active, scale, matrix, SUI_3D_OBJECT_HANDLE_CORNER_3D))
|
|
{
|
|
size[0] = (tmp[0] - pos[0]) * matrix[0];
|
|
size[1] = (tmp[1] - pos[1]) * -matrix[5];
|
|
size[2] = (tmp[2] - pos[2]) * matrix[10];
|
|
output = TRUE;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if(size[0] < 0)
|
|
{
|
|
size[0] = -size[0];
|
|
for(i = 0; i < pointer_count + user_count; i++)
|
|
{
|
|
if(grab[i].id == id)
|
|
{
|
|
if(grab[i].part == 0)
|
|
grab[i].part = 1;
|
|
else if(grab[i].part == 1)
|
|
grab[i].part = 0;
|
|
else if(grab[i].part == 6)
|
|
grab[i].part = 7;
|
|
else if(grab[i].part == 7)
|
|
grab[i].part = 6;
|
|
else if(grab[i].part == 8)
|
|
grab[i].part = 9;
|
|
else if(grab[i].part == 9)
|
|
grab[i].part = 8;
|
|
else if(grab[i].part == 10)
|
|
grab[i].part = 11;
|
|
else if(grab[i].part == 11)
|
|
grab[i].part = 10;
|
|
else if(grab[i].part == 12)
|
|
grab[i].part = 13;
|
|
else if(grab[i].part == 13)
|
|
grab[i].part = 12;
|
|
|
|
else if(grab[i].part == 18)
|
|
grab[i].part = 19;
|
|
else if(grab[i].part == 19)
|
|
grab[i].part = 18;
|
|
else if(grab[i].part == 20)
|
|
grab[i].part = 21;
|
|
else if(grab[i].part == 21)
|
|
grab[i].part = 20;
|
|
else if(grab[i].part == 22)
|
|
grab[i].part = 23;
|
|
else if(grab[i].part == 23)
|
|
grab[i].part = 22;
|
|
else if(grab[i].part == 24)
|
|
grab[i].part = 25;
|
|
else if(grab[i].part == 25)
|
|
grab[i].part = 24;
|
|
}
|
|
}
|
|
}
|
|
if(size[1] < 0)
|
|
{
|
|
size[1] = -size[1];
|
|
for(i = 0; i < pointer_count + user_count; i++)
|
|
{
|
|
if(grab[i].id == id)
|
|
{
|
|
if(grab[i].part == 2)
|
|
grab[i].part = 3;
|
|
else if(grab[i].part == 3)
|
|
grab[i].part = 2;
|
|
else if(grab[i].part == 6)
|
|
grab[i].part = 9;
|
|
else if(grab[i].part == 9)
|
|
grab[i].part = 6;
|
|
else if(grab[i].part == 7)
|
|
grab[i].part = 8;
|
|
else if(grab[i].part == 8)
|
|
grab[i].part = 7;
|
|
|
|
else if(grab[i].part == 14)
|
|
grab[i].part = 15;
|
|
else if(grab[i].part == 15)
|
|
grab[i].part = 14;
|
|
else if(grab[i].part == 16)
|
|
grab[i].part = 17;
|
|
else if(grab[i].part == 17)
|
|
grab[i].part = 16;
|
|
|
|
|
|
else if(grab[i].part == 18)
|
|
grab[i].part = 20;
|
|
else if(grab[i].part == 20)
|
|
grab[i].part = 18;
|
|
else if(grab[i].part == 19)
|
|
grab[i].part = 21;
|
|
else if(grab[i].part == 21)
|
|
grab[i].part = 19;
|
|
else if(grab[i].part == 22)
|
|
grab[i].part = 24;
|
|
else if(grab[i].part == 24)
|
|
grab[i].part = 22;
|
|
else if(grab[i].part == 23)
|
|
grab[i].part = 25;
|
|
else if(grab[i].part == 25)
|
|
grab[i].part = 23;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(size[2] < 0)
|
|
{
|
|
size[2] = -size[2];
|
|
for(i = 0; i < pointer_count + user_count; i++)
|
|
{
|
|
if(grab[i].id == id)
|
|
{
|
|
if(grab[i].part == 4)
|
|
grab[i].part = 5;
|
|
else if(grab[i].part == 5)
|
|
grab[i].part = 4;
|
|
|
|
else if(grab[i].part == 10)
|
|
grab[i].part = 12;
|
|
else if(grab[i].part == 12)
|
|
grab[i].part = 10;
|
|
else if(grab[i].part == 11)
|
|
grab[i].part = 13;
|
|
else if(grab[i].part == 13)
|
|
grab[i].part = 11;
|
|
else if(grab[i].part == 14)
|
|
grab[i].part = 16;
|
|
else if(grab[i].part == 16)
|
|
grab[i].part = 14;
|
|
else if(grab[i].part == 15)
|
|
grab[i].part = 17;
|
|
else if(grab[i].part == 17)
|
|
grab[i].part = 15;
|
|
else if(grab[i].part == 18)
|
|
grab[i].part = 22;
|
|
else if(grab[i].part == 22)
|
|
grab[i].part = 18;
|
|
else if(grab[i].part == 19)
|
|
grab[i].part = 23;
|
|
else if(grab[i].part == 23)
|
|
grab[i].part = 19;
|
|
else if(grab[i].part == 20)
|
|
grab[i].part = 24;
|
|
else if(grab[i].part == 24)
|
|
grab[i].part = 20;
|
|
else if(grab[i].part == 21)
|
|
grab[i].part = 25;
|
|
else if(grab[i].part == 25)
|
|
grab[i].part = 21;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(input->mode == BAM_MAIN && frame_id != input->frame_number)
|
|
{
|
|
frame_id = input->frame_number;
|
|
for(i = 0; i < (pointer_count + user_count); i++)
|
|
{
|
|
if(grab[i].active)
|
|
{
|
|
grab[i].timer += input->delta_time * 2.5;
|
|
if(grab[i].timer > 1.0)
|
|
grab[i].timer = 1.0;
|
|
}else
|
|
grab[i].timer -= input->delta_time * 2.5;
|
|
}
|
|
}
|
|
if(input->mode == BAM_DRAW)
|
|
r_matrix_set(reset);
|
|
return output;
|
|
}
|
|
|
|
|
|
boolean seduce_manipulator_cube_cornered(BInputState *input, RMatrix *m, float *min, float *max, void *id, float *snap, boolean snap_active, float scale, float time)
|
|
{
|
|
static SeduceManipulatorSpaceGrab *grab = NULL;
|
|
static uint frame_id = -1;
|
|
uint i, count, pointer_count, user_count;
|
|
float f, tmp[3], matrix[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}, center[3];
|
|
boolean output = FALSE;
|
|
RMatrix *reset;
|
|
if(m == NULL)
|
|
m = r_matrix_get();
|
|
if(input->mode == BAM_DRAW)
|
|
{
|
|
reset = r_matrix_get();
|
|
r_matrix_set(m);
|
|
}
|
|
|
|
center[0] = (min[0] + max[0]) * 0.5;
|
|
center[1] = (min[1] + max[1]) * 0.5;
|
|
center[2] = (min[2] + max[2]) * 0.5;
|
|
r_matrix_projection_screenf(m, tmp, center[0], center[1], center[2]);
|
|
scale *= -tmp[2] * 0.025;
|
|
|
|
pointer_count = betray_support_functionality(B_SF_POINTER_COUNT_MAX);
|
|
user_count = betray_support_functionality(B_SF_USER_COUNT_MAX);
|
|
|
|
if(grab == NULL)
|
|
{
|
|
count = betray_support_functionality(B_SF_USER_COUNT_MAX);
|
|
count += betray_support_functionality(B_SF_POINTER_COUNT_MAX);
|
|
grab = malloc((sizeof *grab) * count);
|
|
for(i = 0; i < count; i++)
|
|
{
|
|
grab[i].id = NULL;
|
|
r_matrix_identity(&grab[i].matrix);
|
|
}
|
|
}
|
|
|
|
time = (1.0 - time);
|
|
time = time * time * 0.3 * -tmp[2];
|
|
tmp[0] = max[0] + time;
|
|
tmp[1] = center[1];
|
|
tmp[2] = center[2];
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 0, snap, snap_active, 0, scale, matrix, SUI_3D_OBJECT_HANDLE_SURF_3D))
|
|
{
|
|
max[0] = tmp[0];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = min[0] - time;
|
|
tmp[1] = center[1];
|
|
tmp[2] = center[2];
|
|
|
|
matrix[0] = -1;
|
|
matrix[5] = -1;
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 1, snap, snap_active, 0, scale, matrix, SUI_3D_OBJECT_HANDLE_SURF_3D))
|
|
{
|
|
min[0] = tmp[0];
|
|
output = TRUE;
|
|
}
|
|
|
|
tmp[0] = center[0];
|
|
tmp[1] = max[1] + time;
|
|
tmp[2] = center[2];
|
|
matrix[0] = 0;
|
|
matrix[1] = 1;
|
|
matrix[4] = 1;
|
|
matrix[5] = 0;
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 2, snap, snap_active, 1, scale, matrix, SUI_3D_OBJECT_HANDLE_SURF_3D))
|
|
{
|
|
max[1] = tmp[1];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = center[0];
|
|
tmp[1] = min[1] - time;
|
|
tmp[2] = center[2];
|
|
matrix[1] = -1;
|
|
matrix[4] = -1;
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 3, snap, snap_active, 1, scale, matrix, SUI_3D_OBJECT_HANDLE_SURF_3D))
|
|
{
|
|
min[1] = tmp[1];
|
|
output = TRUE;
|
|
}
|
|
|
|
|
|
tmp[0] = center[0];
|
|
tmp[1] = center[1];
|
|
tmp[2] = max[2] + time;
|
|
matrix[1] = 0;
|
|
matrix[4] = 0;
|
|
matrix[2] = 1;
|
|
matrix[5] = 1;
|
|
matrix[8] = 1;
|
|
matrix[10] = 0;
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 4, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_SURF_3D))
|
|
{
|
|
max[2] = tmp[2];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = center[0];
|
|
tmp[1] = center[1];
|
|
tmp[2] = min[2] - time;
|
|
matrix[2] = -1;
|
|
matrix[5] = 1;
|
|
matrix[8] = -1;
|
|
if(seduce_manipulator_point_axis_internal(input, grab, m, tmp, id, 5, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_SURF_3D))
|
|
{
|
|
min[2] = tmp[2];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = max[0] + time;
|
|
tmp[1] = max[1] + time;
|
|
tmp[2] = center[2];
|
|
matrix[0] = 1;
|
|
matrix[5] = 0;
|
|
matrix[6] = 1;
|
|
matrix[2] = 0;
|
|
matrix[8] = 0;
|
|
matrix[9] = 1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 6, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
max[0] = tmp[0];
|
|
max[1] = tmp[1];
|
|
output = TRUE;
|
|
}
|
|
|
|
tmp[0] = min[0] - time;
|
|
tmp[1] = max[1] + time;
|
|
tmp[2] = center[2];
|
|
matrix[0] = -1;
|
|
matrix[6] = 1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 7, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
min[0] = tmp[0];
|
|
max[1] = tmp[1];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = min[0] - time;
|
|
tmp[1] = min[1] - time;
|
|
tmp[2] = center[2];
|
|
matrix[0] = -1;
|
|
matrix[6] = 1;
|
|
matrix[9] = -1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 8, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
min[0] = tmp[0];
|
|
min[1] = tmp[1];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = max[0] + time;
|
|
tmp[1] = min[1] - time;
|
|
tmp[2] = center[2];
|
|
matrix[0] = 1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 9, snap, snap_active, 2, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
max[0] = tmp[0];
|
|
min[1] = tmp[1];
|
|
output = TRUE;
|
|
}
|
|
|
|
tmp[0] = max[0] + time;
|
|
tmp[1] = center[1];
|
|
tmp[2] = max[2] + time;
|
|
matrix[0] = 0;
|
|
matrix[5] = 1;
|
|
matrix[6] = 0;
|
|
matrix[2] = 1;
|
|
matrix[8] = 1;
|
|
matrix[9] = 0;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 10, snap, snap_active, 1, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
max[0] = tmp[0];
|
|
max[2] = tmp[2];
|
|
output = TRUE;
|
|
}
|
|
|
|
tmp[0] = min[0] + time;
|
|
tmp[1] = center[1];
|
|
tmp[2] = max[2] + time;
|
|
matrix[5] = 1;
|
|
matrix[2] = 1;
|
|
matrix[8] = -1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 11, snap, snap_active, 1, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
min[0] = tmp[0];
|
|
max[2] = tmp[2];
|
|
output = TRUE;
|
|
}
|
|
|
|
tmp[0] = max[0] + time;
|
|
tmp[1] = center[1];
|
|
tmp[2] = min[2] - time;
|
|
|
|
matrix[5] = 1;
|
|
matrix[2] = -1;
|
|
matrix[8] = 1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 12, snap, snap_active, 1, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
max[0] = tmp[0];
|
|
min[2] = tmp[2];
|
|
output = TRUE;
|
|
}
|
|
|
|
tmp[0] = min[0] - time;
|
|
tmp[1] = center[1];
|
|
tmp[2] = min[2] - time;
|
|
matrix[5] = 1;
|
|
matrix[2] = -1;
|
|
matrix[8] = -1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 13, snap, snap_active, 1, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
min[0] = tmp[0];
|
|
min[2] = tmp[2];
|
|
output = TRUE;
|
|
}
|
|
|
|
|
|
tmp[0] = center[0];
|
|
tmp[1] = max[1] + time;
|
|
tmp[2] = max[2] + time;
|
|
|
|
matrix[1] = 1;
|
|
matrix[2] = 0;
|
|
matrix[4] = 1;
|
|
matrix[5] = 0;
|
|
matrix[8] = 0;
|
|
matrix[10] = 1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 14, snap, snap_active, 0, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
max[1] = tmp[1];
|
|
max[2] = tmp[2];
|
|
output = TRUE;
|
|
}
|
|
|
|
tmp[0] = center[0];
|
|
tmp[1] = min[1] - time;
|
|
tmp[2] = max[2] + time;
|
|
matrix[1] = -1;
|
|
matrix[4] = 1;
|
|
matrix[10] = 1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 15, snap, snap_active, 0, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
min[1] = tmp[1];
|
|
max[2] = tmp[2];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = center[0];
|
|
tmp[1] = max[1] + time;
|
|
tmp[2] = min[2] - time;
|
|
matrix[1] = 1;
|
|
matrix[4] = 1;
|
|
matrix[10] = -1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 16, snap, snap_active, 0, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
max[1] = tmp[1];
|
|
min[2] = tmp[2];
|
|
output = TRUE;
|
|
}
|
|
tmp[0] = center[0];
|
|
tmp[1] = min[1] - time;
|
|
tmp[2] = min[2] - time;
|
|
matrix[1] = -1;
|
|
matrix[4] = 1;
|
|
matrix[10] = -1;
|
|
if(seduce_manipulator_point_plane_internal(input, grab, m, tmp, id, 17, snap, snap_active, 0, scale, matrix, SUI_3D_OBJECT_HANDLE_SIDE_3D))
|
|
{
|
|
min[1] = tmp[1];
|
|
min[2] = tmp[2];
|
|
output = TRUE;
|
|
}
|
|
matrix[1] = 0;
|
|
matrix[4] = 0;
|
|
matrix[8] = 0;
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
matrix[0] = tmp[0] = (float)(i % 2) * 2.0 - 1.0;
|
|
matrix[5] = tmp[1] = (float)((i / 2) % 2) * -2.0 + 1.0;
|
|
matrix[10] = tmp[2] = (float)((i / 4) % 2) * 2.0 - 1.0;
|
|
if(matrix[0] < 0)
|
|
tmp[0] = min[0] - time;
|
|
else
|
|
tmp[0] = max[0] + time;
|
|
if(-matrix[5] < 0)
|
|
tmp[1] = min[1] - time;
|
|
else
|
|
tmp[1] = max[1] + time;
|
|
if(matrix[10] < 0)
|
|
tmp[2] = min[2] - time;
|
|
else
|
|
tmp[2] = max[2] + time;
|
|
if(seduce_manipulator_point_pos_internal(input, grab, m, tmp, id, 18 + i, snap, snap_active, scale, matrix, SUI_3D_OBJECT_HANDLE_CORNER_3D))
|
|
{
|
|
if(matrix[0] < 0)
|
|
min[0] = tmp[0];
|
|
else
|
|
max[0] = tmp[0];
|
|
if(-matrix[5] < 0)
|
|
min[1] = tmp[1];
|
|
else
|
|
max[1] = tmp[1];
|
|
if(matrix[10] < 0)
|
|
min[2] = tmp[2];
|
|
else
|
|
max[2] = tmp[2];
|
|
output = TRUE;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if(max[0] < min[0])
|
|
{
|
|
f = max[0];
|
|
max[0] = min[0];
|
|
min[0] = f;
|
|
for(i = 0; i < pointer_count + user_count; i++)
|
|
{
|
|
if(grab[i].id == id)
|
|
{
|
|
if(grab[i].part == 0)
|
|
grab[i].part = 1;
|
|
else if(grab[i].part == 1)
|
|
grab[i].part = 0;
|
|
else if(grab[i].part == 6)
|
|
grab[i].part = 7;
|
|
else if(grab[i].part == 7)
|
|
grab[i].part = 6;
|
|
|
|
else if(grab[i].part == 8)
|
|
grab[i].part = 9;
|
|
else if(grab[i].part == 9)
|
|
grab[i].part = 8;
|
|
|
|
else if(grab[i].part == 10)
|
|
grab[i].part = 11;
|
|
else if(grab[i].part == 11)
|
|
grab[i].part = 10;
|
|
|
|
else if(grab[i].part == 12)
|
|
grab[i].part = 13;
|
|
else if(grab[i].part == 13)
|
|
grab[i].part = 12;
|
|
|
|
else if(grab[i].part == 18)
|
|
grab[i].part = 19;
|
|
else if(grab[i].part == 19)
|
|
grab[i].part = 18;
|
|
else if(grab[i].part == 20)
|
|
grab[i].part = 21;
|
|
else if(grab[i].part == 21)
|
|
grab[i].part = 20;
|
|
else if(grab[i].part == 22)
|
|
grab[i].part = 23;
|
|
else if(grab[i].part == 23)
|
|
grab[i].part = 22;
|
|
else if(grab[i].part == 24)
|
|
grab[i].part = 25;
|
|
else if(grab[i].part == 25)
|
|
grab[i].part = 24;
|
|
}
|
|
}
|
|
}
|
|
if(max[1] < min[1])
|
|
{
|
|
f = max[1];
|
|
max[1] = min[1];
|
|
min[1] = f;
|
|
for(i = 0; i < pointer_count + user_count; i++)
|
|
{
|
|
if(grab[i].id == id)
|
|
{
|
|
if(grab[i].part == 2)
|
|
grab[i].part = 3;
|
|
else if(grab[i].part == 3)
|
|
grab[i].part = 2;
|
|
else if(grab[i].part == 6)
|
|
grab[i].part = 9;
|
|
else if(grab[i].part == 9)
|
|
grab[i].part = 6;
|
|
else if(grab[i].part == 7)
|
|
grab[i].part = 8;
|
|
else if(grab[i].part == 8)
|
|
grab[i].part = 7;
|
|
|
|
else if(grab[i].part == 14)
|
|
grab[i].part = 15;
|
|
else if(grab[i].part == 15)
|
|
grab[i].part = 14;
|
|
else if(grab[i].part == 16)
|
|
grab[i].part = 17;
|
|
else if(grab[i].part == 17)
|
|
grab[i].part = 16;
|
|
|
|
|
|
else if(grab[i].part == 18)
|
|
grab[i].part = 20;
|
|
else if(grab[i].part == 20)
|
|
grab[i].part = 18;
|
|
else if(grab[i].part == 19)
|
|
grab[i].part = 21;
|
|
else if(grab[i].part == 21)
|
|
grab[i].part = 19;
|
|
else if(grab[i].part == 22)
|
|
grab[i].part = 24;
|
|
else if(grab[i].part == 24)
|
|
grab[i].part = 22;
|
|
else if(grab[i].part == 23)
|
|
grab[i].part = 25;
|
|
else if(grab[i].part == 25)
|
|
grab[i].part = 23;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(max[2] < min[2])
|
|
{
|
|
f = max[2];
|
|
max[2] = min[2];
|
|
min[2] = f;
|
|
for(i = 0; i < pointer_count + user_count; i++)
|
|
{
|
|
if(grab[i].id == id)
|
|
{
|
|
if(grab[i].part == 4)
|
|
grab[i].part = 5;
|
|
else if(grab[i].part == 5)
|
|
grab[i].part = 4;
|
|
|
|
else if(grab[i].part == 10)
|
|
grab[i].part = 12;
|
|
else if(grab[i].part == 12)
|
|
grab[i].part = 10;
|
|
else if(grab[i].part == 11)
|
|
grab[i].part = 13;
|
|
else if(grab[i].part == 13)
|
|
grab[i].part = 11;
|
|
else if(grab[i].part == 14)
|
|
grab[i].part = 16;
|
|
else if(grab[i].part == 16)
|
|
grab[i].part = 14;
|
|
else if(grab[i].part == 15)
|
|
grab[i].part = 17;
|
|
else if(grab[i].part == 17)
|
|
grab[i].part = 15;
|
|
else if(grab[i].part == 18)
|
|
grab[i].part = 22;
|
|
else if(grab[i].part == 22)
|
|
grab[i].part = 18;
|
|
else if(grab[i].part == 19)
|
|
grab[i].part = 23;
|
|
else if(grab[i].part == 23)
|
|
grab[i].part = 19;
|
|
else if(grab[i].part == 20)
|
|
grab[i].part = 24;
|
|
else if(grab[i].part == 24)
|
|
grab[i].part = 20;
|
|
else if(grab[i].part == 21)
|
|
grab[i].part = 25;
|
|
else if(grab[i].part == 25)
|
|
grab[i].part = 21;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(input->mode == BAM_MAIN && frame_id != input->frame_number)
|
|
{
|
|
frame_id = input->frame_number;
|
|
for(i = 0; i < (pointer_count + user_count); i++)
|
|
{
|
|
if(grab[i].active)
|
|
{
|
|
grab[i].timer += input->delta_time * 2.5;
|
|
if(grab[i].timer > 1.0)
|
|
grab[i].timer = 1.0;
|
|
}else
|
|
grab[i].timer -= input->delta_time * 2.5;
|
|
}
|
|
}
|
|
if(input->mode == BAM_DRAW)
|
|
r_matrix_set(reset);
|
|
return output;
|
|
}
|