QuelSolaar/s_sort.c

2161 lines
89 KiB
C

#include <math.h>
#include <stdlib.h>
#include "seduce.h"
#include "s_draw_3d.h"
typedef enum{
SEDUCE_SET_POINT,
SEDUCE_SET_LINE,
SEDUCE_SET_TRIANGLE,
SEDUCE_SET_QUAD,
SEDUCE_SET_COUNT
}SSortElementType;
typedef struct{
void *id;
void *id_down_click;
uint part;
char *tooltip;
char *tooltip_description;
float tooltip_timer;
}SSortAction;
typedef struct{
SSortElementType type;
float pos[16];
void *id;
uint part;
uint user_id;
uint draw_id;
}SSortElement;
typedef struct{
RMatrix matrix;
void *id;
}SSortSurface;
typedef struct{
float pos[3];
float draw[3];
void *id;
uint part;
char *tooltip;
char *tooltip_description;
float tooltip_timer;
float click_timer;
float fade_timer;
}SSortSelection;
typedef struct{
float pos[3];
float timer;
float color[3];
}SSortClick;
#define SEDUCE_SORT_CLICK_COUNT 16
struct{
SSortElement *element;
uint element_count;
uint element_allocated;
SSortSurface *surface;
uint surface_count;
uint surface_allocated;
SSortSelection *selected;
SSortClick clicks[SEDUCE_SORT_CLICK_COUNT];
uint frame_number;
SSortAction *action;
boolean action_computed;
uint user_id;
float center[2];
float scale;
float bound[2];
float tooltip_size;
float tooltip_color[4];
void *debug_id;
}SSortStorage;
void seduce_viewport_set(float x_start, float y_start, float x_end, float y_end)
{
float aspect;
uint screen_x, screen_y;
aspect = betray_screen_mode_get(&screen_x, &screen_y, NULL);
y_start /= aspect;
y_end /= aspect;
r_viewport((int)((float)screen_x * (x_start + 1) / 2.0),
(int)((float)screen_y * (y_start + 1) / 2.0),
(int)((float)screen_x * (x_end + 1) / 2.0) - (int)((float)screen_x * (x_start + 1) / 2.0),
(int)((float)screen_y * (y_end + 1) / 2.0) - (int)((float)screen_y * (y_start + 1) / 2.0));
SSortStorage.center[0] = (x_start + x_end) * 0.5;
SSortStorage.center[1] = (y_start + y_end) * 0.5 * aspect;
SSortStorage.scale = (x_end - x_start) * 0.5;
SSortStorage.bound[0] = 1.0;
SSortStorage.bound[1] = aspect;
}
void seduce_matrix_projection_screenf(float *output, float x, float y, float z)
{
float temp[3];
// r_matrix_projection_cameraf(r_matrix_get(), output, x, y, z);
r_matrix_projection_screenf(r_matrix_get(), temp, x, y, z);
output[0] = (temp[0] * SSortStorage.scale + SSortStorage.center[0]);
output[1] = (temp[1] * SSortStorage.scale + SSortStorage.center[1]);
output[2] = temp[2];
}
void seduce_element_init()
{
static boolean init = TRUE;
if(init)
{
uint i;
init = FALSE;
SSortStorage.element = NULL;
SSortStorage.element_count = 0;
SSortStorage.element_allocated = 0;
SSortStorage.surface = NULL;
SSortStorage.surface_count = 0;
SSortStorage.surface_allocated = 0;
SSortStorage.frame_number = 0;
for(i = 0; i < SEDUCE_SORT_CLICK_COUNT; i++)
{
SSortStorage.clicks[i].color[0] = 0;
SSortStorage.clicks[i].color[1] = 0;
SSortStorage.clicks[i].color[2] = 0;
SSortStorage.clicks[i].pos[0] = 0;
SSortStorage.clicks[i].pos[1] = 0;
SSortStorage.clicks[i].pos[2] = 0;
SSortStorage.clicks[i].timer = 1000;
}
SSortStorage.action = malloc((sizeof *SSortStorage.action) * betray_support_functionality(B_SF_POINTER_COUNT_MAX));
SSortStorage.action_computed = FALSE;
for(i = 0; i < betray_support_functionality(B_SF_USER_COUNT_MAX); i++)
{
SSortStorage.action[i].tooltip = NULL;
SSortStorage.action[i].tooltip_description = NULL;
}
SSortStorage.user_id = -1;
SSortStorage.selected = malloc((sizeof *SSortStorage.selected) * betray_support_functionality(B_SF_USER_COUNT_MAX));
for(i = 0; i < betray_support_functionality(B_SF_USER_COUNT_MAX); i++)
{
SSortStorage.selected[i].pos[0] = 0;
SSortStorage.selected[i].pos[1] = 0;
SSortStorage.selected[i].pos[2] = 0;
SSortStorage.selected[i].draw[0] = 0;
SSortStorage.selected[i].draw[1] = 0;
SSortStorage.selected[i].draw[2] = 0;
SSortStorage.selected[i].id = NULL;
SSortStorage.selected[i].part = 0;
SSortStorage.selected[i].tooltip = NULL;
SSortStorage.selected[i].tooltip_timer = 0;
SSortStorage.selected[i].click_timer = 10.0;
SSortStorage.selected[i].fade_timer = 40.0;
}
SSortStorage.center[0] = 0;
SSortStorage.center[1] = 0;
SSortStorage.scale = 1.0;
SSortStorage.bound[0] = 1.0;
SSortStorage.bound[1] = 10000;
SSortStorage.tooltip_size = SEDUCE_T_SIZE * 2.0;
SSortStorage.tooltip_color[0] = 0.1;
SSortStorage.tooltip_color[1] = 0.1;
SSortStorage.tooltip_color[2] = 0.1;
SSortStorage.tooltip_color[2] = 0.5;
SSortStorage.debug_id = NULL;
}
}
void seduce_element_center_get(uint element, float *center)
{
uint i, count;
float *pos;
pos = SSortStorage.element[element].pos;
switch(SSortStorage.element[element].type)
{
case SEDUCE_SET_POINT :
center[0] = pos[0];
center[1] = pos[1];
center[2] = pos[2];
break;
case SEDUCE_SET_LINE :
center[0] = (pos[0] + pos[3]) / 2.0;
center[1] = (pos[1] + pos[4]) / 2.0;
center[2] = (pos[2] + pos[5]) / 2.0;
break;
case SEDUCE_SET_TRIANGLE :
center[0] = pos[9];
center[1] = pos[10];
center[2] = pos[11];
break;
case SEDUCE_SET_QUAD :
center[0] = pos[12];
center[1] = pos[13];
center[2] = pos[14];
break;
}
}
boolean seduce_element_position_get(void *id, float *pos)
{
uint i, count;
for(i = 0; i < SSortStorage.element_count; i++)
{
if(SSortStorage.element[i].id == id)
{
seduce_element_center_get(i, pos);
return TRUE;
}
}
return FALSE;
}
void seduce_element_select(uint user_id, void *id, uint part, SSortElementType type, float *pos)
{
uint i, count;
switch(type)
{
case SEDUCE_SET_POINT :
SSortStorage.selected[user_id].pos[0] = pos[0];
SSortStorage.selected[user_id].pos[1] = pos[1];
SSortStorage.selected[user_id].pos[2] = pos[2];
break;
case SEDUCE_SET_LINE :
SSortStorage.selected[user_id].pos[0] = (pos[0] + pos[3]) / 2.0;
SSortStorage.selected[user_id].pos[1] = (pos[1] + pos[4]) / 2.0;
SSortStorage.selected[user_id].pos[2] = (pos[2] + pos[5]) / 2.0;
break;
case SEDUCE_SET_TRIANGLE :
SSortStorage.selected[user_id].pos[0] = pos[9];
SSortStorage.selected[user_id].pos[1] = pos[10];
SSortStorage.selected[user_id].pos[2] = pos[11];
break;
case SEDUCE_SET_QUAD :
SSortStorage.selected[user_id].pos[0] = pos[12];
SSortStorage.selected[user_id].pos[1] = pos[13];
SSortStorage.selected[user_id].pos[2] = pos[14];
break;
}
SSortStorage.selected[user_id].part = part;
if(SSortStorage.selected[user_id].id != id)
{
SSortStorage.selected[user_id].tooltip = NULL;
SSortStorage.selected[user_id].tooltip_timer = 0;
SSortStorage.selected[user_id].id = id;
}
}
void seduce_element_add_point(BInputState *input, void *id, uint part, float *pos, float size)
{
RMatrix *matrix;
uint i;
if(id == NULL)
return;
if(id == SSortStorage.debug_id)
{
uint *a = NULL;
*a = 0;
}
if(input->frame_number != SSortStorage.frame_number)
{
SSortStorage.element_count = 0;
SSortStorage.surface_count = 0;
SSortStorage.action_computed = FALSE;
}
SSortStorage.frame_number = input->frame_number;
if(SSortStorage.element_count == SSortStorage.element_allocated)
{
SSortStorage.element_allocated += 256;
SSortStorage.element = realloc(SSortStorage.element, (sizeof *SSortStorage.element) * (SSortStorage.element_allocated));
}
seduce_matrix_projection_screenf(SSortStorage.element[SSortStorage.element_count].pos, pos[0], pos[1], pos[2]);
SSortStorage.element[SSortStorage.element_count].pos[3] = size / -SSortStorage.element[SSortStorage.element_count].pos[2];
SSortStorage.element[SSortStorage.element_count].id = id;
SSortStorage.element[SSortStorage.element_count].part = part;
SSortStorage.element[SSortStorage.element_count].type = SEDUCE_SET_POINT;
SSortStorage.element[SSortStorage.element_count].user_id = SSortStorage.user_id;
SSortStorage.element[SSortStorage.element_count].draw_id = input->draw_id;
for(i = 0; i < input->user_count; i++)
if(id == SSortStorage.selected[i].id && part == SSortStorage.selected[i].part)
seduce_element_select(i, id, part, SEDUCE_SET_POINT, SSortStorage.element[SSortStorage.element_count].pos);
SSortStorage.element_count++;
}
void seduce_element_add_line(BInputState *input, void *id, uint part, float *a, float *b, float size)
{
uint i;
if(id == NULL)
return;
if(id == SSortStorage.debug_id)
{
uint *a = NULL;
*a = 0;
}
if(input->frame_number != SSortStorage.frame_number)
{
SSortStorage.element_count = 0;
SSortStorage.surface_count = 0;
SSortStorage.action_computed = FALSE;
}
SSortStorage.frame_number = input->frame_number;
if(SSortStorage.element_count == SSortStorage.element_allocated)
{
SSortStorage.element_allocated += 256;
SSortStorage.element = realloc(SSortStorage.element, (sizeof *SSortStorage.element) * (SSortStorage.element_allocated));
}
seduce_matrix_projection_screenf(SSortStorage.element[SSortStorage.element_count].pos, a[0], a[1], a[2]);
seduce_matrix_projection_screenf(&SSortStorage.element[SSortStorage.element_count].pos[3], b[0], b[1], b[2]);
SSortStorage.element[SSortStorage.element_count].pos[6] = size / -(SSortStorage.element[SSortStorage.element_count].pos[2] + SSortStorage.element[SSortStorage.element_count].pos[5]) * 0.5;
/* f_transform3f(SSortStorage.element[SSortStorage.element_count].pos, matrix->matrix[matrix->current], a[0], a[1], a[2]);
SSortStorage.element[SSortStorage.element_count].pos[0] /= -SSortStorage.element[SSortStorage.element_count].pos[2];
SSortStorage.element[SSortStorage.element_count].pos[1] /= -SSortStorage.element[SSortStorage.element_count].pos[2];
f_transform3f(&SSortStorage.element[SSortStorage.element_count].pos[3], matrix->matrix[matrix->current], b[0], b[1], b[2]);
SSortStorage.element[SSortStorage.element_count].pos[3] /= -SSortStorage.element[SSortStorage.element_count].pos[5];
SSortStorage.element[SSortStorage.element_count].pos[4] /= -SSortStorage.element[SSortStorage.element_count].pos[5];*/
SSortStorage.element[SSortStorage.element_count].id = id;
SSortStorage.element[SSortStorage.element_count].part = part;
SSortStorage.element[SSortStorage.element_count].type = SEDUCE_SET_LINE;
SSortStorage.element[SSortStorage.element_count].user_id = SSortStorage.user_id;
SSortStorage.element[SSortStorage.element_count].draw_id = input->draw_id;
for(i = 0; i < input->user_count; i++)
if(id == SSortStorage.selected[i].id && part == SSortStorage.selected[i].part)
seduce_element_select(i, id, part, SEDUCE_SET_LINE, SSortStorage.element[SSortStorage.element_count].pos);
SSortStorage.element_count++;
}
boolean seduce_element_triangle_test(float *pos, float *array, float *vectors)
{
float vec[2];
vec[0] = pos[0] - array[0];
vec[1] = pos[1] - array[1];
if(vectors[0] * vec[0] + vectors[1] * vec[1] > 0)
{
if(vectors[4] * vec[0] + vectors[5] * vec[1] > 0)
{
vec[0] = pos[0] - array[3];
vec[1] = pos[1] - array[4];
if(vectors[2] * vec[0] + vectors[3] * vec[1] > 0)
return TRUE;
}
}else
{
if(vectors[4] * vec[0] + vectors[5] * vec[1] < 0)
{
vec[0] = pos[0] - array[3];
vec[1] = pos[1] - array[4];
if(vectors[2] * vec[0] + vectors[3] * vec[1] < 0)
return TRUE;
}
}
return FALSE;
}
void seduce_element_add_triangle(BInputState *input, void *id, uint part, float *a, float *b, float *c)
{
float vertex[9], vecs[6], vec[2];
uint i;
if(id == NULL)
return;
if(id == SSortStorage.debug_id)
{
uint *a = NULL;
*a = 0;
}
seduce_matrix_projection_screenf(&vertex[0], a[0], a[1], a[2]);
seduce_matrix_projection_screenf(&vertex[3], b[0], b[1], b[2]);
seduce_matrix_projection_screenf(&vertex[6], c[0], c[1], c[2]);
vecs[0] = vertex[4] - vertex[1];
vecs[1] = vertex[0] - vertex[3];
vecs[2] = vertex[7] - vertex[4];
vecs[3] = vertex[3] - vertex[6];
vecs[4] = vertex[1] - vertex[7];
vecs[5] = vertex[6] - vertex[0];
for(i = 0; i < SSortStorage.element_count; i++)
{
if(SSortStorage.element[i].type == SEDUCE_SET_POINT &&
seduce_element_triangle_test(SSortStorage.element[i].pos, vertex, vecs))
{
SSortStorage.element[i] = SSortStorage.element[--SSortStorage.element_count];
i--;
}
}
if(input->frame_number != SSortStorage.frame_number)
{
SSortStorage.element_count = 0;
SSortStorage.surface_count = 0;
SSortStorage.action_computed = FALSE;
}
SSortStorage.frame_number = input->frame_number;
if(SSortStorage.element_count == SSortStorage.element_allocated)
{
SSortStorage.element_allocated += 256;
SSortStorage.element = realloc(SSortStorage.element, (sizeof *SSortStorage.element) * (SSortStorage.element_allocated));
}
for(i = 0; i < 9; i++)
SSortStorage.element[SSortStorage.element_count].pos[i] = vertex[i];
SSortStorage.element[SSortStorage.element_count].pos[9] = 0;
SSortStorage.element[SSortStorage.element_count].pos[10] = 0;
for(i = 0; i < 9; i += 3)
{
SSortStorage.element[SSortStorage.element_count].pos[9] += vertex[i] / 3.0;
SSortStorage.element[SSortStorage.element_count].pos[10] += vertex[i + 1] / 3.0;
}
SSortStorage.element[SSortStorage.element_count].id = id;
SSortStorage.element[SSortStorage.element_count].part = part;
SSortStorage.element[SSortStorage.element_count].draw_id = input->draw_id;
SSortStorage.element[SSortStorage.element_count].type = SEDUCE_SET_TRIANGLE;
SSortStorage.element[SSortStorage.element_count].user_id = SSortStorage.user_id;
for(i = 0; i < input->user_count; i++)
if(id == SSortStorage.selected[i].id && part == SSortStorage.selected[i].part)
seduce_element_select(i, id, part, SEDUCE_SET_TRIANGLE, SSortStorage.element[SSortStorage.element_count].pos);
SSortStorage.element_count++;
}
boolean seduce_element_quad_test(float *pos, float *array, float *vectors)
{
float vec[2];
vec[0] = pos[0] - array[0];
vec[1] = pos[1] - array[1];
if(vectors[0] * vec[0] + vectors[1] * vec[1] > 0)
{
if(vectors[6] * vec[0] + vectors[7] * vec[1] > 0)
{
vec[0] = pos[0] - array[6];
vec[1] = pos[1] - array[7];
if(vectors[2] * vec[0] + vectors[3] * vec[1] > 0)
if(vectors[4] * vec[0] + vectors[5] * vec[1] > 0)
return TRUE;
}
}else if(vectors[6] * vec[0] + vectors[7] * vec[1] < 0)
{
vec[0] = pos[0] - array[6];
vec[1] = pos[1] - array[7];
if(vectors[2] * vec[0] + vectors[3] * vec[1] < 0)
if(vectors[4] * vec[0] + vectors[5] * vec[1] < 0)
return TRUE;
}
return FALSE;
}
void seduce_element_add_quad(BInputState *input, void *id, uint part, float *a, float *b, float *c, float *d)
{
float vertex[12], vecs[8], vec[2];
uint i;
if(id == NULL)
return;
if(id == SSortStorage.debug_id)
{
uint *a = NULL;
*a = 0;
}
seduce_matrix_projection_screenf(&vertex[0], a[0], a[1], a[2]);
seduce_matrix_projection_screenf(&vertex[3], b[0], b[1], b[2]);
seduce_matrix_projection_screenf(&vertex[6], c[0], c[1], c[2]);
seduce_matrix_projection_screenf(&vertex[9], d[0], d[1], d[2]);
vecs[0] = vertex[4] - vertex[1];
vecs[1] = vertex[0] - vertex[3];
vecs[2] = vertex[7] - vertex[4];
vecs[3] = vertex[3] - vertex[6];
vecs[4] = vertex[10] - vertex[7];
vecs[5] = vertex[6] - vertex[9];
vecs[6] = vertex[1] - vertex[10];
vecs[7] = vertex[9] - vertex[0];
/* for(i = 0; i < SSortStorage.element_count; i++)
{
if(SSortStorage.element[i].type == SEDUCE_SET_POINT &&
seduce_element_quad_test(SSortStorage.element[i].pos, vertex, vecs))
{
SSortStorage.element[i] = SSortStorage.element[--SSortStorage.element_count];
i--;
}
}*/
if(input->frame_number != SSortStorage.frame_number)
{
SSortStorage.element_count = 0;
SSortStorage.surface_count = 0;
SSortStorage.action_computed = FALSE;
}
SSortStorage.frame_number = input->frame_number;
if(SSortStorage.element_count == SSortStorage.element_allocated)
{
SSortStorage.element_allocated += 256;
SSortStorage.element = realloc(SSortStorage.element, (sizeof *SSortStorage.element) * (SSortStorage.element_allocated));
}
for(i = 0; i < 12; i++)
SSortStorage.element[SSortStorage.element_count].pos[i] = vertex[i];
SSortStorage.element[SSortStorage.element_count].pos[12] = 0;
SSortStorage.element[SSortStorage.element_count].pos[13] = 0;
for(i = 0; i < 12; i += 3)
{
SSortStorage.element[SSortStorage.element_count].pos[12] += vertex[i] / 4.0;
SSortStorage.element[SSortStorage.element_count].pos[13] += vertex[i + 1] / 4.0;
}
SSortStorage.element[SSortStorage.element_count].id = id;
SSortStorage.element[SSortStorage.element_count].part = part;
SSortStorage.element[SSortStorage.element_count].draw_id = input->draw_id;
SSortStorage.element[SSortStorage.element_count].type = SEDUCE_SET_QUAD;
SSortStorage.element[SSortStorage.element_count].user_id = SSortStorage.user_id;
for(i = 0; i < input->user_count; i++)
if(id == SSortStorage.selected[i].id && part == SSortStorage.selected[i].part)
seduce_element_select(i, id, part, SEDUCE_SET_QUAD, SSortStorage.element[SSortStorage.element_count].pos);
SSortStorage.element_count++;
}
void seduce_element_add_rectangle(BInputState *input, void *id, uint part, float pos_x, float pos_y, float size_x, float size_y)
{
float array[12];
array[0] = pos_x;
array[1] = pos_y;
array[2] = 0;
array[3] = pos_x + size_x;
array[4] = pos_y;
array[5] = 0;
array[6] = pos_x + size_x;
array[7] = pos_y + size_y;
array[8] = 0;
array[9] = pos_x;
array[10] = pos_y + size_y;
array[11] = 0;
seduce_element_add_quad(input, id, part, array, &array[3], &array[6], &array[9]);
}
void seduce_element_add_surface(BInputState *input, void *id)
{
RMatrix *matrix;
uint i;
if(id == NULL)
return;
if(id == SSortStorage.debug_id)
{
uint *a = NULL;
*a = 0;
}
if(input->frame_number != SSortStorage.frame_number)
{
SSortStorage.element_count = 0;
SSortStorage.surface_count = 0;
SSortStorage.action_computed = FALSE;
}
SSortStorage.frame_number = input->frame_number;
if(SSortStorage.surface_count == SSortStorage.surface_allocated)
{
SSortStorage.surface_allocated += 256;
SSortStorage.surface = realloc(SSortStorage.surface, (sizeof *SSortStorage.surface) * (SSortStorage.surface_allocated));
}
matrix = r_matrix_get();
SSortStorage.surface[SSortStorage.surface_count].id = id;
SSortStorage.surface[SSortStorage.surface_count].matrix = *matrix;
SSortStorage.surface_count++;
}
void seduce_element_add_center(BInputState *input, void *id, float *center)
{
float pos[3];
uint i;
seduce_matrix_projection_screenf(pos, center[0], center[1], center[2]);
pos[0] /= -pos[2];
pos[1] /= -pos[2];
for(i = 0; i < SSortStorage.element_count; i++)
{
if(SSortStorage.element[i].type == SEDUCE_SET_TRIANGLE)
{
SSortStorage.element[i].pos[12] = pos[0];
SSortStorage.element[i].pos[13] = pos[1];
}
if(SSortStorage.element[i].type == SEDUCE_SET_QUAD)
{
SSortStorage.element[i].pos[12] = pos[0];
SSortStorage.element[i].pos[13] = pos[1];
}
}
}
boolean seduce_element_surface_project(BInputState *input, void *id, float *output, uint axis, float pointer_x, float pointer_y)
{
float zero[3] = {0, 0, 0}, out[3];
uint i;
for(i = 0; i < SSortStorage.surface_count; i++)
if(SSortStorage.surface[i].id == id)
break;
if(i == SSortStorage.surface_count)
return FALSE;
r_matrix_projection_surfacef(&SSortStorage.surface[i].matrix, output, zero, axis, pointer_x, pointer_y);
return TRUE;
}
/*
boolean seduce_element_surface_project(BInputState *input, void *id, float *output, float pointer_x, float pointer_y)
{
float center[3], axis_vector[9], zero[3] = {0, 0, 0}, vector[3], out[3], f;
uint i, axis = 2 * 3;
for(i = 0; i < SSortStorage.element_count; i++)
if(SSortStorage.element[i].id == id && SSortStorage.element[i].type == SEDUCE_SET_MATRIX)
break;
if(i == SSortStorage.element_count)
return FALSE;
f_transform3f(center, SSortStorage.element[i].pos, 0, 0, 0);
f_transform3f(&axis_vector[0], SSortStorage.element[i].pos, 1, 0, 0);
f_transform3f(&axis_vector[3], SSortStorage.element[i].pos, 0, 1, 0);
f_transform3f(&axis_vector[6], SSortStorage.element[i].pos, 0, 0, 1);
axis_vector[axis + 0] -= center[0];
axis_vector[axis + 1] -= center[1];
axis_vector[axis + 2] -= center[2];
vector[0] = pointer_x;
vector[1] = pointer_y;
vector[2] = -1;
f_normalize3f(vector);
f_project3f(out, center, &axis_vector[axis], zero, vector);
out[0] -= center[0];
out[1] -= center[1];
out[2] -= center[2];
axis_vector[axis + 0] -= center[0];
axis_vector[axis + 1] -= center[1];
axis_vector[axis + 2] -= center[2];
axis = (axis + 3) % 9;
f = axis_vector[axis + 0] * axis_vector[axis + 0] + axis_vector[axis + 1] * axis_vector[axis + 1] + axis_vector[axis + 2] * axis_vector[axis + 2];
axis_vector[axis + 0] /= f;
axis_vector[axis + 1] /= f;
axis_vector[axis + 2] /= f;
axis_vector[axis + 0] -= center[0];
axis_vector[axis + 1] -= center[1];
axis_vector[axis + 2] -= center[2];
axis = (axis + 3) % 9;
f = axis_vector[axis + 0] * axis_vector[axis + 0] + axis_vector[axis + 1] * axis_vector[axis + 1] + axis_vector[axis + 2] * axis_vector[axis + 2];
axis_vector[axis + 0] /= f;
axis_vector[axis + 1] /= f;
axis_vector[axis + 2] /= f;
output[1] = out[0] * axis_vector[axis + 0] + out[1] * axis_vector[axis + 1] + out[2] * axis_vector[axis + 2];
axis = (axis + 6) % 9;
output[0] = out[0] * axis_vector[axis + 0] + out[1] * axis_vector[axis + 1] + out[2] * axis_vector[axis + 2];
return TRUE;
}
*/
boolean seduce_element_active(BInputState *input, void *id, void *part)
{
uint i;
for(i = 0; i < input->pointer_count; i++)
if(id == seduce_element_pointer_id(input, i, part))
return TRUE;
for(i = 0; i < input->user_count; i++)
if(id == seduce_element_selected_id(i, NULL, part))
return TRUE;
return FALSE;
}
uint seduce_element_primary_axis(BInputState *input, uint user_id)
{
uint axis;
for(axis = 0; axis < input->axis_count && (input->axis[axis].axis_type != B_AXIS_STICK || input->axis[axis].axis_count == 1 || input->axis[axis].user_id != user_id); axis++);
if(input->axis_count == axis)
for(axis = 0; axis < input->axis_count && (input->axis[axis].axis_type != B_AXIS_SUBSTICK || input->axis[axis].axis_count == 1 || input->axis[axis].user_id != user_id); axis++);
if(input->axis_count == axis)
return -1;
return axis;
}
void seduce_object_3d_draw(BInputState *input, float pos_x, float pos_y, float pos_z, float size, uint id, float fade, float *color);
uint seduce_element_direction_test(BInputState *input, uint user_id, float dir_x, float dir_y, float pos_x, float pos_y)
{
float f, best = 100000000.0, vec[2], center[2];
uint i, found = -1, axis;
for(i = 0; i < SSortStorage.element_count; i++)
{
if(SSortStorage.element[i].id != SSortStorage.selected[user_id].id || SSortStorage.element[i].part != SSortStorage.selected[user_id].part)
{
seduce_element_center_get(i, vec);
vec[0] -= SSortStorage.selected[user_id].pos[0];
vec[1] -= SSortStorage.selected[user_id].pos[1];
if(0.001 < vec[0] * dir_x + vec[1] * dir_y)
{
seduce_element_center_get(i, center);
vec[0] = center[0] - pos_x;
vec[1] = center[1] - pos_y;
f = vec[0] * vec[0] + vec[1] * vec[1];
if(f < best)
{
best = f;
found = i;
}
}
}
}
return found;
}
void seduce_element_debug(BInputState *input)
{
RMatrix matrix, *m;
float color[3], *p, aspect, size, vec[2];
uint i, j, user_count;
/* if(input->frame_number == SSortStorage.frame_number)
{
BInputState *input;
uint i, j, count;
float pos[2];
input = betray_get_input_state();
if(!SSortStorage.action_computed)
{
float f, best, vec[2];
for(i = 0; i < input->pointer_count; i++)
{
pos[0] = input->pointers[i].pointer_x;
pos[1] = input->pointers[i].pointer_y;
SSortStorage.action[i].id = seduce_element_colission_test(pos, &SSortStorage.action[i].part, input->pointers[i].user_id);
}
count = betray_support_functionality(B_SF_POINTER_COUNT_MAX);
for(; i < count; i++)
SSortStorage.action[i].id = NULL;
SSortStorage.action_computed = TRUE;
}
}*/
m = r_matrix_get();
r_matrix_identity(&matrix);
aspect = betray_screen_mode_get(NULL, NULL, NULL);
r_matrix_frustum(&matrix, -0.05, 0.05, -0.05 * aspect, 0.05 * aspect, 0.05, 10.0);
r_matrix_translate(&matrix, 0.0, 0.0, -1.0);
r_matrix_set(&matrix);
user_count = betray_support_functionality(B_SF_USER_COUNT_MAX);
for(i = 0; i < SSortStorage.element_count; i++)
{
if(SSortStorage.element[i].draw_id == input->draw_id)
{
p = SSortStorage.element[i].pos;
color[0] = 1;
color[1] = (float)(1 + i) / (float)SSortStorage.element_count;
if(SSortStorage.element[i].user_id != -1)
color[2] = 1.0;
else
color[2] = 0.0;
for(j = 0; j < input->pointer_count; j++)
if(SSortStorage.action[j].id == SSortStorage.element[i].id && SSortStorage.action[j].part == SSortStorage.element[i].part)
color[0] = 0.0;
switch(SSortStorage.element[i].type)
{
case SEDUCE_SET_POINT:
size = p[3] * 0.7;
r_primitive_line_3d(p[0] + size, p[1] + size, 0, p[0] - size, p[1] - size, 0, color[0], color[1], color[2], 1.1);
r_primitive_line_3d(p[0] - size, p[1] + size, 0, p[0] + size, p[1] - size, 0, color[0], color[1], color[2], 1.1);
break;
case SEDUCE_SET_LINE:
size = SSortStorage.element[i].pos[6];
vec[0] = p[0] - p[3];
vec[1] = p[1] - p[4];
f_normalize2f(vec);
vec[0] *= size;
vec[1] *= size;
r_primitive_line_3d(p[0] + vec[1], p[1] - vec[0], 0, p[3] + vec[1], p[4] - vec[0], 0, color[0], color[1], color[2], 1.1);
r_primitive_line_3d(p[0] - vec[1], p[1] + vec[0], 0, p[3] - vec[1], p[4] + vec[0], 0, color[0], color[1], color[2], 1.1);
r_primitive_line_3d(p[0] + vec[1], p[1] - vec[0], 0, p[0] - vec[1], p[1] + vec[0], 0, color[0], color[1], color[2], 1.1);
r_primitive_line_3d(p[3] + vec[1], p[4] - vec[0], 0, p[3] - vec[1], p[4] + vec[0], 0, color[0], color[1], color[2], 1.1);
break;
case SEDUCE_SET_TRIANGLE:
r_primitive_line_3d(p[0], p[1], 0, p[3], p[4], 0, color[0], color[1], color[2], 1.1);
r_primitive_line_3d(p[3], p[4], 0, p[6], p[7], 0, color[0], color[1], color[2], 1.1);
r_primitive_line_3d(p[6], p[7], 0, p[0], p[1], 0, color[0], color[1], color[2], 1.1);
break;
case SEDUCE_SET_QUAD:
r_primitive_line_3d(p[0], p[1], 0, p[3], p[4], 0, color[0], color[1], color[2], 1.1);
r_primitive_line_3d(p[3], p[4], 0, p[6], p[7], 0, color[0], color[1], color[2], 1.1);
r_primitive_line_3d(p[6], p[7], 0, p[9], p[10], 0, color[0], color[1], color[2], 1.1);
r_primitive_line_3d(p[9], p[10], 0, p[0], p[1], 0, color[0], color[1], color[2], 1.1);
break;
}
}
}
r_primitive_line_flush();
r_matrix_set(m);
}
void s_sort_draw_tool_tip(BInputState *input, float x, float y, char *text, char *description, float text_size, float timer, float red, float green, float blue, float alpha)
{
if(input->mode == BAM_DRAW)
{
float f, aspect, length, headline_length, center[3], height, full_height, expand_timer, pos[2], arrow_pos, arrow_size, shadow[8 * 2], text_color = 0;
uint shadow_count = 3;
SeduceBackgroundObject *object;
STextBlockMode modes;
if(red + green + blue < 1.5)
text_color = 1.0;
timer *= 4.0;
expand_timer = 0.0;
if(timer > 1.0)
{
if(timer > 3.0)
{
expand_timer = timer - 3.0;
if(expand_timer >= 1.0)
expand_timer = 1.0;
}
timer = 1.0;
}
aspect = betray_screen_mode_get(NULL, NULL, NULL);
center[0] = x;
center[1] = y;
center[2] = 0;
headline_length = length = seduce_text_line_length(NULL, text_size, 0.200, text, -1) + text_size * 4.0;
if(description != NULL)
{
modes.character_position = 0;
modes.font = seduce_font_default_get(); /* Font */
modes.red = text_color; /* Red color component of text */
modes.green = text_color; /* Green color component of text */
modes.blue = text_color; /* Red color component of text */
modes.alpha = 1.0; /* Alpha component of text */
modes.letter_size = text_size; /* Sice of charcters */
modes.letter_spacing = 0.200; /* Added spacing between chacters. Use SEDUCE_T_SPACE as default value.*/
if(headline_length < text_size * 48.0)
length = text_size * 48.0;
f = seduce_text_block_height(length - text_size * 12.0, 3.2, SEDUCE_TBAS_STRETCH, description, 0, &modes, 1, -1) + text_size * 10.0;
length = headline_length;
if(headline_length < text_size * 48.0 * expand_timer)
length = text_size * 48.0 * expand_timer;
height = text_size * 3.0 + f * expand_timer;
full_height = text_size * 3.0 + f;
arrow_size = text_size * 3.0;
}else
{
expand_timer = 0;
full_height = height = text_size * 3.0;
}
arrow_size = text_size * (1.5 + expand_timer * 1.5);
object = seduce_background_object_allocate();
if(x * x > (0.9 - length * 0.5) * (0.9 - length * 0.5))
{
pos[1] = y + height * 0.5;
if(pos[1] > aspect - arrow_size)
pos[1] = aspect - arrow_size;
if(pos[1] - height < arrow_size - aspect)
pos[1] = arrow_size - aspect + height;
arrow_pos = y;
if(arrow_pos > aspect - arrow_size * 2)
arrow_pos = aspect - arrow_size * 2;
if(arrow_pos < -aspect + arrow_size * 2)
arrow_pos = -aspect + arrow_size * 2;
if(x > 0.0)
{
pos[0] = x - arrow_size - length;
shadow[0] = x - arrow_size;
shadow[1] = arrow_pos + arrow_size;
shadow[2] = x;
shadow[3] = y;
shadow[4] = x - arrow_size;
shadow[5] = arrow_pos - arrow_size;
shadow_count = 6;
if(arrow_pos - arrow_size > pos[1] - height)
{
shadow[shadow_count++] = pos[0] + length;
shadow[shadow_count++] = pos[1] - height;
}
shadow[shadow_count++] = pos[0];
shadow[shadow_count++] = pos[1] - height;
shadow[shadow_count++] = pos[0];
shadow[shadow_count++] = pos[1];
if(arrow_pos + arrow_size < pos[1])
{
shadow[shadow_count++] = pos[0] + length;
shadow[shadow_count++] = pos[1];
}
shadow_count /= 2;
}else
{
pos[0] = x + arrow_size;
shadow[0] = x + arrow_size;
shadow[1] = arrow_pos - arrow_size;
shadow[2] = x;
shadow[3] = y;
shadow[4] = x + arrow_size;
shadow[5] = arrow_pos + arrow_size;
shadow_count = 6;
if(arrow_pos + arrow_size < pos[1])
{
shadow[shadow_count++] = pos[0];
shadow[shadow_count++] = pos[1];
}
shadow[shadow_count++] = pos[0] + length;
shadow[shadow_count++] = pos[1];
shadow[shadow_count++] = pos[0] + length;
shadow[shadow_count++] = pos[1] - height;
if(arrow_pos - arrow_size > pos[1] - height)
{
shadow[shadow_count++] = pos[0];
shadow[shadow_count++] = pos[1] - height;
}
shadow_count /= 2;
}
}else if(y + full_height < aspect)
{
pos[0] = x - length * 0.5;
pos[1] = y + height + arrow_size;
shadow[0] = x + arrow_size;
shadow[1] = y + arrow_size;
shadow[2] = x;
shadow[3] = y;
shadow[4] = x - arrow_size;
shadow[5] = y + arrow_size;
shadow[6] = pos[0];
shadow[7] = pos[1] - height;
shadow[8] = pos[0];
shadow[9] = pos[1];
shadow[10] = pos[0] + length;
shadow[11] = pos[1];
shadow[12] = pos[0] + length;
shadow[13] = pos[1] - height;
shadow_count = 7;
}else
{
pos[0] = x - length * 0.5;
pos[1] = y - arrow_size;
shadow[0] = x - arrow_size;
shadow[1] = y - arrow_size;
shadow[2] = x;
shadow[3] = y;
shadow[4] = x + arrow_size;
shadow[5] = y - arrow_size;
shadow[6] = pos[0] + length;
shadow[7] = pos[1];
shadow[8] = pos[0] + length;
shadow[9] = pos[1] - height;
shadow[10] = pos[0];
shadow[11] = pos[1] - height;
shadow[12] = pos[0];
shadow[13] = pos[1];
shadow_count = 7;
}
seduce_background_tri_add(object, NULL, 0,
shadow[0], shadow[1], 0.000,
shadow[2], shadow[3], 0.000,
shadow[4], shadow[5], 0.000,
red, green, blue, alpha);
seduce_background_quad_add(object, NULL, 0,
pos[0], pos[1], 0.000,
pos[0] + length, pos[1], 0.000,
pos[0] + length, pos[1] - height, 0.000,
pos[0], pos[1] - height, 0.000,
red, green, blue, alpha);
seduce_background_shadow_add(object, shadow, shadow_count, TRUE, text_size * 2.0);
seduce_primitive_surface_draw(input, object, timer);
seduce_primitive_background_object_free(object);
seduce_text_line_draw(NULL, pos[0] + text_size * 2.0 + expand_timer * (length - headline_length) * 0.5, pos[1] - text_size * 2.0 - text_size * 3.0 * expand_timer, text_size, 0.200, text, text_color, text_color, text_color, 1.0, -1);
if(expand_timer > 0.99 && description != NULL)
seduce_text_block_draw(pos[0] + text_size * 6.0, pos[1] - text_size * 8.0, length - text_size * 12.0, 10000, 3.2, SEDUCE_TBAS_STRETCH, description, 0, &modes, 1);
}
}
extern void seduce_particle_update(BInputState *input);
extern void seduce_surface_click_buffer_update(BInputState *input);
#define SEDUCE_SORT_AXIS_LENGTH 0.1
void seduce_element_endframe(BInputState *input, boolean debug)
{
RMatrix matrix, *save;
float *pos, aspect, axis_length = 0.2, vec[3], axis_pos[2], f, f2, best, color, center[3], m[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}, radius, fade;
uint i, j, user_id, axis, found;
if(input->mode == BAM_DRAW)
{
SSortStorage.action_computed = FALSE;
save = r_matrix_get();
r_matrix_identity(&matrix);
aspect = betray_screen_mode_get(&i, &j, NULL);
r_matrix_frustum(&matrix, -0.05, 0.05, -0.05 * aspect, 0.05 * aspect, 0.05, 10.0);
r_matrix_translate(&matrix, 0.0, 0.0, -1.0);
r_matrix_set(&matrix);
r_viewport(0, 0, i, j);
if(debug)
{
float left, right, top, bottom;
for(i = 0; i < input->pointer_count; i++)
{
r_primitive_line_2d(input->pointers[i].pointer_x - 0.1,
input->pointers[i].pointer_y,
input->pointers[i].pointer_x + 0.1,
input->pointers[i].pointer_y, 1, 1, 1, 1);
r_primitive_line_2d(input->pointers[i].pointer_x,
input->pointers[i].pointer_y - 0.1,
input->pointers[i].pointer_x,
input->pointers[i].pointer_y + 0.1, 1, 1, 1, 1);
r_primitive_line_2d(input->pointers[i].pointer_x,
input->pointers[i].pointer_y,
input->pointers[i].pointer_x + input->pointers[i].delta_pointer_x,
input->pointers[i].pointer_y + input->pointers[i].delta_pointer_y, 1, 1, 1, 1);
for(j = 0; j < input->pointers[i].button_count; j++)
{
r_primitive_line_2d(input->pointers[i].click_pointer_x[j] - 0.03,
input->pointers[i].click_pointer_y[j] - 0.03,
input->pointers[i].click_pointer_x[j] + 0.03,
input->pointers[i].click_pointer_y[j] + 0.03, 0.6, 0.6, 0.6, 1);
r_primitive_line_2d(input->pointers[i].click_pointer_x[j] + 0.03,
input->pointers[i].click_pointer_y[j] - 0.03,
input->pointers[i].click_pointer_x[j] - 0.03,
input->pointers[i].click_pointer_y[j] + 0.03, 0.6, 0.6, 0.6, 1);
}
}
betray_screen_mode_safe_get(BETRAY_SA_ACTION, &left, &right, &top, &bottom);
r_primitive_line_2d(left, top, right, top, 0.6, 0.6, 0.6, 1);
r_primitive_line_2d(left, bottom, right, bottom, 0.6, 0.6, 0.6, 1);
r_primitive_line_2d(left, top, left, bottom, 0.6, 0.6, 0.6, 1);
r_primitive_line_2d(right, top, right, bottom, 0.6, 0.6, 0.6, 1);
betray_screen_mode_safe_get(BETRAY_SA_TITLE, &left, &right, &top, &bottom);
r_primitive_line_2d(left, top, right, top, 0.4, 0.4, 0.4, 1);
r_primitive_line_2d(left, bottom, right, bottom, 0.4, 0.4, 0.4, 1);
r_primitive_line_2d(left, top, left, bottom, 0.4, 0.4, 0.4, 1);
r_primitive_line_2d(right, top, right, bottom, 0.4, 0.4, 0.4, 1);
r_primitive_line_flush();
seduce_element_debug(input);
}
}
if(input->mode == BAM_MAIN)
seduce_surface_click_buffer_update(input);
for(i = 0; i < input->pointer_count; i++)
{
if(input->mode == BAM_MAIN)
SSortStorage.action[i].tooltip_timer += input->delta_time;
SSortStorage.action[i].tooltip_description;
if(input->mode == BAM_DRAW && NULL != SSortStorage.action[i].tooltip)
s_sort_draw_tool_tip(input, input->pointers[i].pointer_x, input->pointers[i].pointer_y, SSortStorage.action[i].tooltip, SSortStorage.action[i].tooltip_description, SSortStorage.tooltip_size, SSortStorage.action[i].tooltip_timer, SSortStorage.tooltip_color[0], SSortStorage.tooltip_color[1], SSortStorage.tooltip_color[2], SSortStorage.tooltip_color[3]);
}
if(input->mode == BAM_MAIN)
for(i = 0; i < SEDUCE_SORT_CLICK_COUNT; i++)
SSortStorage.clicks[i].timer += input->delta_time;
if(input->mode == BAM_MAIN)
{
for(i = 0; i < SEDUCE_SORT_CLICK_COUNT; i++)
{
if(SSortStorage.clicks[i].timer < 4.0)
{
f = SSortStorage.clicks[i].timer / 1.0;
f = f * 0.1 + f * f;
seduce_primitive_circle_add_3d(NULL,
SSortStorage.clicks[i].pos[0], SSortStorage.clicks[i].pos[1], SSortStorage.clicks[i].pos[2],
1, 0, 0,
0, 0, 1,
0.02 * (f * 10.0 + 1),
0.0, 1.0,
0, 1,
SSortStorage.clicks[i].color[0], SSortStorage.clicks[i].color[1], SSortStorage.clicks[i].color[2], 1 - f,
SSortStorage.clicks[i].color[0], SSortStorage.clicks[i].color[1], SSortStorage.clicks[i].color[2], 1 - f);
}
}
}
for(user_id = 0; user_id < input->user_count; user_id++)
{
SSortStorage.selected[user_id].draw[0] = SSortStorage.selected[user_id].draw[0] * (1 - input->delta_time * 10.0) + SSortStorage.selected[user_id].pos[0] * input->delta_time * 10.0;
SSortStorage.selected[user_id].draw[1] = SSortStorage.selected[user_id].draw[1] * (1 - input->delta_time * 10.0) + SSortStorage.selected[user_id].pos[1] * input->delta_time * 10.0;
axis = seduce_element_primary_axis(input, user_id);
found = -1;
best = 100000;
if(input->mode == BAM_MAIN)
{
SSortStorage.selected[user_id].tooltip_timer += input->delta_time;
SSortStorage.selected[user_id].click_timer += input->delta_time;
SSortStorage.selected[user_id].fade_timer += input->delta_time;
}
if(input->mode == BAM_DRAW && NULL != SSortStorage.selected[user_id].tooltip)
s_sort_draw_tool_tip(input, SSortStorage.selected[user_id].draw[0], SSortStorage.selected[user_id].draw[1], SSortStorage.selected[user_id].tooltip, SSortStorage.selected[user_id].tooltip_description, SSortStorage.tooltip_size, SSortStorage.selected[user_id].tooltip_timer, SSortStorage.tooltip_color[0], SSortStorage.tooltip_color[1], SSortStorage.tooltip_color[2], SSortStorage.tooltip_color[3]);
if(input->axis_count > axis)
{
radius = 1;
/* if(SSortStorage.selected[user_id].fade_timer < 0.5)
radius = 1 + 4.0 * (1.0 - SSortStorage.selected[user_id].fade_timer / 0.5);
else if(SSortStorage.selected[user_id].fade_timer < 0.5)
SSortStorage.selected[user_id].fade_timer;
*/
if(input->mode == BAM_EVENT && betray_button_get(user_id, BETRAY_BUTTON_FACE_A))
{
SSortStorage.selected[user_id].click_timer = 0;
found = 0;
for(i = 1; i < SEDUCE_SORT_CLICK_COUNT; i++)
if(SSortStorage.clicks[i].timer > SSortStorage.clicks[found].timer)
found = i;
SSortStorage.clicks[found].timer = 0;
SSortStorage.clicks[found].pos[0] = SSortStorage.selected[user_id].pos[0];
SSortStorage.clicks[found].pos[1] = SSortStorage.selected[user_id].pos[1];
SSortStorage.clicks[found].pos[2] = SSortStorage.selected[user_id].pos[2];
SSortStorage.clicks[found].color[0] = 1;
SSortStorage.clicks[found].color[1] = 1;
SSortStorage.clicks[found].color[2] = 1;
}
if(input->mode == BAM_DRAW)
{
/* {
char text[256];
sprintf(text, "click %f fade %f", SSortStorage.selected[user_id].click_timer, SSortStorage.selected[user_id].fade_timer);
seduce_text_line_draw(NULL, 0.0, 0.0, SEDUCE_T_SIZE * 5, SEDUCE_T_SPACE, text, 1.0, 1.0, 1.0, 0.5, -1);
} */
if(SSortStorage.selected[user_id].click_timer < 0.5)
radius *= f_spline(SSortStorage.selected[user_id].click_timer / 0.5, 1, -0.5, 1, 1);
// radius *= 1.0 - SSortStorage.selected[user_id].click_timer * (1.0 - SSortStorage.selected[user_id].click_timer) * 4.0;
// if(SSortStorage.selected[user_id].click_timer < 1.0)
// radius = SSortStorage.selected[user_id].click_timer;
fade = 1;
radius *= 0.02;
/* if(input->axis[axis].axis[0] < 0.01 && input->axis[axis].axis[0] > -0.01 && input->axis[axis].axis[1] < 0.01 && input->axis[axis].axis[1] > -0.01)
{
seduce_primitive_circle_add_3d(NULL,
SSortStorage.selected[user_id].draw[0], SSortStorage.selected[user_id].draw[1], 0,
1, 0, 0,
0, 0, 1,
radius,
0.0, 1.0,
0, 1,
fade, fade, fade, 1,
fade, fade, fade, 1);
seduce_primitive_line_draw(NULL);
}else
{
f = radius / sqrt(input->axis[axis].axis[0] * input->axis[axis].axis[0] + input->axis[axis].axis[1] * input->axis[axis].axis[1]);
seduce_primitive_circle_add_3d(NULL,
SSortStorage.selected[user_id].draw[0], SSortStorage.selected[user_id].draw[1], 0,
input->axis[axis].axis[0], input->axis[axis].axis[1], 0,
0, 0, 1,
radius,
0.25, 0.5,
0, 1,
fade, fade, fade, 1,
fade, fade, fade, 1);
seduce_primitive_circle_add_3d(NULL,
SSortStorage.selected[user_id].draw[0] + input->axis[axis].axis[0] * SEDUCE_SORT_AXIS_LENGTH, SSortStorage.selected[user_id].draw[1] + input->axis[axis].axis[1] * SEDUCE_SORT_AXIS_LENGTH, 0,
input->axis[axis].axis[0], input->axis[axis].axis[1], 0,
0, 0, 1,
radius,
0.75, 0.5,
0, 1,
fade, fade, fade, 1,
fade, fade, fade, 1);
seduce_primitive_line_add_3d(NULL,
SSortStorage.selected[user_id].draw[0] + input->axis[axis].axis[0] * SEDUCE_SORT_AXIS_LENGTH + f * input->axis[axis].axis[1], SSortStorage.selected[user_id].draw[1] + input->axis[axis].axis[1] * SEDUCE_SORT_AXIS_LENGTH - f * input->axis[axis].axis[0], 0,
SSortStorage.selected[user_id].draw[0] + f * input->axis[axis].axis[1], SSortStorage.selected[user_id].draw[1] - f * input->axis[axis].axis[0], 0,
fade, fade, fade, 1,
fade, fade, fade, 1);
seduce_primitive_line_add_3d(NULL,
SSortStorage.selected[user_id].draw[0] + input->axis[axis].axis[0] * SEDUCE_SORT_AXIS_LENGTH - f * input->axis[axis].axis[1], SSortStorage.selected[user_id].draw[1] + input->axis[axis].axis[1] * SEDUCE_SORT_AXIS_LENGTH + f * input->axis[axis].axis[0], 0,
SSortStorage.selected[user_id].draw[0] - f * input->axis[axis].axis[1], SSortStorage.selected[user_id].draw[1] + f * input->axis[axis].axis[0], 0,
fade, fade, fade, 1,
fade, fade, fade, 1);
seduce_primitive_line_draw(NULL);
}*/
}
if(input->axis[axis].axis[0] > 0.01 || input->axis[axis].axis[0] < -0.01 || input->axis[axis].axis[1] > 0.01 || input->axis[axis].axis[1] < -0.01)
{
if(SSortStorage.selected[user_id].fade_timer > 0.5)
SSortStorage.selected[user_id].fade_timer = 0.5;
/* if(input->mode == BAM_DRAW)
{
f = sqrt(input->axis[axis].axis[0] * input->axis[axis].axis[0] + input->axis[axis].axis[1] * input->axis[axis].axis[1]);
m[0] = -input->axis[axis].axis[1] / f;
m[1] = input->axis[axis].axis[0] / f;
m[4] = -m[1];
m[5] = m[0];
m[10] = -1;
m[12] = SSortStorage.selected[user_id].draw[0];
m[13] = SSortStorage.selected[user_id].draw[1];
r_matrix_push(&matrix);
r_matrix_matrix_mult(&matrix, m);
seduce_object_3d_draw(input, 0, 0, 0, -0.04, SUI_3D_OBJECT_EXTEND, 1, NULL);
r_matrix_pop(&matrix);
for(i = 1; i < 8; i++)
{
r_matrix_push(&matrix);
f2 = (float)i * (f * axis_length + 0.025) / 7.0;
m[12] = SSortStorage.selected[user_id].draw[0] + input->axis[axis].axis[0] / f * f2;
m[13] = SSortStorage.selected[user_id].draw[1] + input->axis[axis].axis[1] / f * f2;
r_matrix_matrix_mult(&matrix, m);
seduce_object_3d_draw(input, 0, 0, 0, -0.04, SUI_3D_OBJECT_EXTEND_CENTER, 1, NULL);
r_matrix_pop(&matrix);
}
r_matrix_push(&matrix);
m[12] = SSortStorage.selected[user_id].draw[0] + input->axis[axis].axis[0] * axis_length;
m[13] = SSortStorage.selected[user_id].draw[1] + input->axis[axis].axis[1] * axis_length;
r_matrix_matrix_mult(&matrix, m);
seduce_object_3d_draw(input, 0, 0, 0, -0.04, SUI_3D_OBJECT_EXTEND_TIP, 1, NULL);
r_matrix_pop(&matrix);
m[12] = SSortStorage.selected[user_id].draw[0] + input->axis[axis].axis[0] * axis_length;
m[13] = SSortStorage.selected[user_id].draw[1] + input->axis[axis].axis[1] * axis_length;
}*/
axis_pos[0] = SSortStorage.selected[user_id].pos[0] + input->axis[axis].axis[0] * axis_length;
axis_pos[1] = SSortStorage.selected[user_id].pos[1] + input->axis[axis].axis[1] * axis_length;
// seduce_element_direction_test(BInputState *input, uint user_id, float dir_x, float dir_y, float pos_x, float pos_y)
found = -1;
for(i = 0; i < SSortStorage.element_count; i++)
{
if(SSortStorage.element[i].id != SSortStorage.selected[user_id].id || SSortStorage.element[i].part != SSortStorage.selected[user_id].part)
{
seduce_element_center_get(i, vec);
vec[0] -= SSortStorage.selected[user_id].pos[0];
vec[1] -= SSortStorage.selected[user_id].pos[1];
if(0.001 < vec[0] * input->axis[axis].axis[0] + vec[1] * input->axis[axis].axis[1])
{
seduce_element_center_get(i, center);
vec[0] = center[0] - axis_pos[0];
vec[1] = center[1] - axis_pos[1];
f = vec[0] * vec[0] + vec[1] * vec[1];
if(f < best)
{
best = f;
found = i;
}
}
}
}
if(found != -1)
{
if(input->mode == BAM_DRAW)
{
seduce_element_center_get(found, vec);
seduce_object_3d_draw(input, vec[0], vec[1], 0, -0.1, SUI_3D_OBJECT_SELECTRING, 1, NULL);
}
if(input->mode == BAM_EVENT)
if(betray_button_get(user_id, BETRAY_BUTTON_FACE_B))
seduce_element_select(user_id, SSortStorage.element[found].id, SSortStorage.element[found].part, SSortStorage.element[found].type, SSortStorage.element[found].pos);
}
}
}
}
// if(input->mode == BAM_MAIN)
// seduce_particle_update(input);
// seduce_background_particle(input);
if(input->mode == BAM_DRAW)
{
r_matrix_set(save);
}
if(input->mode == BAM_EVENT)
{
void *id;
id = seduce_element_pointer_id(input, 0, NULL);
if(betray_button_get(-1, BETRAY_BUTTON_PAUSE))
SSortStorage.debug_id = id;
if(betray_button_get(-1, BETRAY_BUTTON_F1 + 11))
SSortStorage.debug_id = id;
seduce_element_pointer(input, id, NULL);
}
}
void *seduce_element_colission_test(float *pos, uint *part, uint user_id)
{
uint i, j, count;
float best, f, f2, vecs[8], found_pos[2] = {0, 0}, vec[2];
void *found_id = NULL;
uint found_part = 0;
if(part != NULL)
*part = 0;
best = 1.0;
found_pos[0] = pos[0];
found_pos[1] = pos[1];
for(i = 0; i < SSortStorage.element_count && SSortStorage.element[i].user_id != user_id; i++);
if(i == SSortStorage.element_count)
user_id = -1;
for(i = SSortStorage.element_count; i != 0;)
{
i--;
if(SSortStorage.element[i].user_id == user_id)
{
switch(SSortStorage.element[i].type)
{
case SEDUCE_SET_POINT :
vec[0] = (SSortStorage.element[i].pos[0] - pos[0]) / SSortStorage.element[i].pos[3];
vec[1] = (SSortStorage.element[i].pos[1] - pos[1]) / SSortStorage.element[i].pos[3];
f = vec[0] * vec[0] + vec[1] * vec[1];
if(f < best)
{
best = f;
found_id = SSortStorage.element[i].id;
found_part = SSortStorage.element[i].part;
if(part != NULL)
*part = found_part;
found_pos[0] = pos[0];
found_pos[1] = pos[1];
}
break;
case SEDUCE_SET_LINE :
vec[0] = SSortStorage.element[i].pos[3] - SSortStorage.element[i].pos[0];
vec[1] = SSortStorage.element[i].pos[4] - SSortStorage.element[i].pos[1];
f = sqrt(vec[0] * vec[0] + vec[1] * vec[1]);
vec[0] /= f;
vec[1] /= f;
f2 = vec[0] * (pos[0] - SSortStorage.element[i].pos[0]) + vec[1] * (pos[1] - SSortStorage.element[i].pos[1]);
if(f2 > 0)
{
if(f2 < f)
{
vec[0] = (SSortStorage.element[i].pos[0] + vec[0] * f2 - pos[0]) / SSortStorage.element[i].pos[6];
vec[1] = (SSortStorage.element[i].pos[1] + vec[1] * f2 - pos[1]) / SSortStorage.element[i].pos[6];
f = vec[0] * vec[0] + vec[1] * vec[1];
if(f < best)
{
best = f;
found_id = SSortStorage.element[i].id;
found_part = SSortStorage.element[i].part;
if(part != NULL)
*part = found_part;
}
}
}
break;
case SEDUCE_SET_TRIANGLE :
vecs[0] = SSortStorage.element[i].pos[4] - SSortStorage.element[i].pos[1];
vecs[1] = SSortStorage.element[i].pos[0] - SSortStorage.element[i].pos[3];
vecs[2] = SSortStorage.element[i].pos[7] - SSortStorage.element[i].pos[4];
vecs[3] = SSortStorage.element[i].pos[3] - SSortStorage.element[i].pos[6];
vecs[4] = SSortStorage.element[i].pos[1] - SSortStorage.element[i].pos[7];
vecs[5] = SSortStorage.element[i].pos[6] - SSortStorage.element[i].pos[0];
if(seduce_element_triangle_test(pos, SSortStorage.element[i].pos, vecs))
{
if(found_id != NULL)
{
for(j = 0; j < SSortStorage.element_count; j++)
{
if(SSortStorage.element[j].id == found_id && SSortStorage.element[j].part == found_part)
{
if(SSortStorage.element[j].type == SEDUCE_SET_TRIANGLE)
{
vecs[0] = SSortStorage.element[j].pos[4] - SSortStorage.element[j].pos[1];
vecs[1] = SSortStorage.element[j].pos[0] - SSortStorage.element[j].pos[3];
vecs[2] = SSortStorage.element[j].pos[7] - SSortStorage.element[j].pos[4];
vecs[3] = SSortStorage.element[j].pos[3] - SSortStorage.element[j].pos[6];
vecs[4] = SSortStorage.element[j].pos[1] - SSortStorage.element[j].pos[7];
vecs[5] = SSortStorage.element[j].pos[6] - SSortStorage.element[j].pos[0];
if(seduce_element_triangle_test(found_pos, SSortStorage.element[i].pos, vecs))
return found_id;
}
if(SSortStorage.element[j].type == SEDUCE_SET_QUAD)
{
vecs[0] = SSortStorage.element[j].pos[4] - SSortStorage.element[j].pos[1];
vecs[1] = SSortStorage.element[j].pos[0] - SSortStorage.element[j].pos[3];
vecs[2] = SSortStorage.element[j].pos[7] - SSortStorage.element[j].pos[4];
vecs[3] = SSortStorage.element[j].pos[3] - SSortStorage.element[j].pos[6];
vecs[4] = SSortStorage.element[j].pos[10] - SSortStorage.element[j].pos[7];
vecs[5] = SSortStorage.element[j].pos[6] - SSortStorage.element[j].pos[9];
vecs[6] = SSortStorage.element[j].pos[1] - SSortStorage.element[j].pos[10];
vecs[7] = SSortStorage.element[j].pos[9] - SSortStorage.element[j].pos[0];
if(seduce_element_quad_test(found_pos, SSortStorage.element[j].pos, vecs))
return found_id;
}
}
}
return found_id;
}else
{
if(part != NULL)
*part = SSortStorage.element[i].part;
return SSortStorage.element[i].id;
}
}
break;
case SEDUCE_SET_QUAD :
vecs[0] = SSortStorage.element[i].pos[4] - SSortStorage.element[i].pos[1];
vecs[1] = SSortStorage.element[i].pos[0] - SSortStorage.element[i].pos[3];
vecs[2] = SSortStorage.element[i].pos[7] - SSortStorage.element[i].pos[4];
vecs[3] = SSortStorage.element[i].pos[3] - SSortStorage.element[i].pos[6];
vecs[4] = SSortStorage.element[i].pos[10] - SSortStorage.element[i].pos[7];
vecs[5] = SSortStorage.element[i].pos[6] - SSortStorage.element[i].pos[9];
vecs[6] = SSortStorage.element[i].pos[1] - SSortStorage.element[i].pos[10];
vecs[7] = SSortStorage.element[i].pos[9] - SSortStorage.element[i].pos[0];
if(seduce_element_quad_test(pos, SSortStorage.element[i].pos, vecs))
{
if(found_id != NULL)
{
for(j = 0; j < SSortStorage.element_count; j++)
{
if(SSortStorage.element[j].id == found_id && SSortStorage.element[j].part == found_part)
{
if(SSortStorage.element[j].type == SEDUCE_SET_TRIANGLE)
{
vecs[0] = SSortStorage.element[j].pos[4] - SSortStorage.element[j].pos[1];
vecs[1] = SSortStorage.element[j].pos[0] - SSortStorage.element[j].pos[3];
vecs[2] = SSortStorage.element[j].pos[7] - SSortStorage.element[j].pos[4];
vecs[3] = SSortStorage.element[j].pos[3] - SSortStorage.element[j].pos[6];
vecs[4] = SSortStorage.element[j].pos[1] - SSortStorage.element[j].pos[7];
vecs[5] = SSortStorage.element[j].pos[6] - SSortStorage.element[j].pos[0];
if(seduce_element_triangle_test(found_pos, SSortStorage.element[i].pos, vecs))
return found_id;
}
if(SSortStorage.element[j].type == SEDUCE_SET_QUAD)
{
vecs[0] = SSortStorage.element[j].pos[4] - SSortStorage.element[j].pos[1];
vecs[1] = SSortStorage.element[j].pos[0] - SSortStorage.element[j].pos[3];
vecs[2] = SSortStorage.element[j].pos[7] - SSortStorage.element[j].pos[4];
vecs[3] = SSortStorage.element[j].pos[3] - SSortStorage.element[j].pos[6];
vecs[4] = SSortStorage.element[j].pos[10] - SSortStorage.element[j].pos[7];
vecs[5] = SSortStorage.element[j].pos[6] - SSortStorage.element[j].pos[9];
vecs[6] = SSortStorage.element[j].pos[1] - SSortStorage.element[j].pos[10];
vecs[7] = SSortStorage.element[j].pos[9] - SSortStorage.element[j].pos[0];
if(seduce_element_quad_test(found_pos, SSortStorage.element[j].pos, vecs))
return found_id;
}
}
}
return found_id;
}else
{
if(part != NULL)
*part = SSortStorage.element[i].part;
return SSortStorage.element[i].id;
}
}
break;
}
}
}
return found_id;
}
void seduce_action_compute(BInputState *input)
{
uint i, j, count;
float pos[2];
void *id;
if(!SSortStorage.action_computed && input->mode == BAM_EVENT)
{
float f, best, vec[2];
for(i = 0; i < input->pointer_count; i++)
{
pos[0] = input->pointers[i].pointer_x;
pos[1] = input->pointers[i].pointer_y;
id = seduce_element_colission_test(pos, &SSortStorage.action[i].part, input->pointers[i].user_id);
if(SSortStorage.action[i].id != id)
{
SSortStorage.action[i].id = id;
SSortStorage.action[i].tooltip = NULL;
SSortStorage.action[i].tooltip_description = NULL;
SSortStorage.action[i].tooltip_timer = 0;
}
if(input->pointers[i].button[0] && !input->pointers[i].last_button[0])
SSortStorage.action[i].id_down_click = id;
}
count = betray_support_functionality(B_SF_POINTER_COUNT_MAX);
for(; i < count; i++)
{
SSortStorage.action[i].id = NULL;
SSortStorage.action[i].id_down_click = NULL;
SSortStorage.action[i].tooltip = NULL;
SSortStorage.action[i].tooltip_description = NULL;
SSortStorage.action[i].tooltip_timer = 0;
}
SSortStorage.action_computed = TRUE;
}
}
uint seduce_element_pointer(BInputState *input, void *id, uint *part)
{
uint i, count;
count = betray_support_functionality(B_SF_POINTER_COUNT_MAX);
seduce_action_compute(input);
for(i = 0; i < count; i++)
{
if(SSortStorage.action[i].id == id)
{
if(part != NULL)
*part = SSortStorage.action[i].part;
return i;
}
}
return -1;
}
void *seduce_element_pointer_id(BInputState *input, uint pointer, uint *part)
{
seduce_action_compute(input);
if(part != NULL)
*part = SSortStorage.action[pointer].part;
return SSortStorage.action[pointer].id;
}
void *seduce_element_pointer_down_click_id(BInputState *input, uint pointer, uint *part)
{
seduce_action_compute(input);
if(part != NULL)
*part = SSortStorage.action[pointer].part;
return SSortStorage.action[pointer].id_down_click;
}
void *seduce_element_selected_id(uint user_id, float *pos, uint *part)
{
if(pos != NULL)
{
pos[0] = SSortStorage.selected[user_id].pos[0];
pos[1] = SSortStorage.selected[user_id].pos[1];
pos[2] = SSortStorage.selected[user_id].pos[2];
}
if(part != NULL)
*part = SSortStorage.selected[user_id].part;
return SSortStorage.selected[user_id].id;
}
void seduce_element_user_exclusive_begin(uint user_id)
{
SSortStorage.user_id = user_id;
}
void seduce_element_user_exclusive_end()
{
SSortStorage.user_id = -1;
}
void seduce_tool_tip(BInputState *input, void *id, char *tooltip, char *extended)
{
uint i, count;
if(input->mode == BAM_DRAW)
{
count = betray_support_functionality(B_SF_USER_COUNT_MAX);
for(i = 0; i < count; i++)
{
if(SSortStorage.selected[i].id == id && SSortStorage.action[i].tooltip_timer > 0.1)
{
SSortStorage.selected[i].tooltip = tooltip;
SSortStorage.selected[i].tooltip_description = extended;
}
}
count = betray_support_functionality(B_SF_POINTER_COUNT_MAX);
for(i = 0; i < count; i++)
{
if(SSortStorage.action[i].id == id && SSortStorage.action[i].tooltip_timer > 0.1)
{
SSortStorage.action[i].tooltip = tooltip;
SSortStorage.action[i].tooltip_description = extended;
}
}
}
}
void seduce_tool_tip_settings(float text_size, float red, float green, float blue, float alpha)
{
SSortStorage.tooltip_size = text_size;
SSortStorage.tooltip_color[0] = red;
SSortStorage.tooltip_color[1] = green;
SSortStorage.tooltip_color[2] = blue;
SSortStorage.tooltip_color[3] = alpha;
}
void seduce_draw_tool_tip_one_old(BInputState *input, float x, float y)
{
static float time = 1.0;
float matrix[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}, scale = 1, pos[2];
float color[4] = {0.2, 0.6, 1.0, 1.0};
char *text = "HERE IS MY TEXT";
pos[0] = x;
pos[1] = y + scale * 0.1;
// if(input->mode == BAM_MAIN)
// seduce_animate(input, &time, input->pointers[0].button[0], 1.5);
if(input->mode == BAM_DRAW)
{
r_matrix_push(NULL);
matrix[4] = pos[0] - x;
matrix[5] = pos[1] - y;
f_normalize2f(&matrix[4]);
matrix[0] = -matrix[5];
matrix[1] = matrix[4];
matrix[12] = pos[0];
matrix[13] = pos[1];
r_matrix_matrix_mult(NULL, matrix);
if((int)(input->minute_time * 100.0) % 5 == 0)
r_matrix_rotate(NULL, input->minute_time * 360 * 100.0, 0, 1, 0);
seduce_object_3d_draw(input, 0, -0.016 + time * -0.16, 0, scale * 0.05, SUI_3D_OBJECT_MARKER, 1, color);
r_matrix_pop(NULL);
if(matrix[4] > 0.1)
seduce_text_line_draw(NULL, matrix[12] + scale * 0.025, matrix[13] - scale * SEDUCE_T_SIZE * 0.5, scale * SEDUCE_T_SIZE, SEDUCE_T_SPACE, text, 1, 1, 1, 1, -1);
else if(matrix[4] < -0.1)
seduce_text_line_draw(NULL, matrix[12] - scale * 0.025 - seduce_text_line_length(NULL, scale * SEDUCE_T_SIZE, SEDUCE_T_SPACE, text, -1), matrix[13] - scale * SEDUCE_T_SIZE * 0.5, scale * SEDUCE_T_SIZE, SEDUCE_T_SPACE, text, 1, 1, 1, 1, -1);
else if(matrix[5] < 0.0)
seduce_text_line_draw(NULL, matrix[12] - seduce_text_line_length(NULL, scale * SEDUCE_T_SIZE * 0.5, SEDUCE_T_SPACE, text, -1), matrix[13] - scale * 0.025, scale * SEDUCE_T_SIZE, SEDUCE_T_SPACE, text, 1, 1, 1, 1, -1);
else
seduce_text_line_draw(NULL, matrix[12] - seduce_text_line_length(NULL, scale * SEDUCE_T_SIZE * 0.5, SEDUCE_T_SPACE, text, -1), matrix[13] + scale * 0.025, scale * SEDUCE_T_SIZE, SEDUCE_T_SPACE, text, 1, 1, 1, 1, -1);
}
}
void seduce_draw_tool_tip_one(BInputState *input, float x, float y)
{
char *tooltip = "MMMM", text[512], *t = "A text byte stream cannot be losslessly converted to UTF-16, due to the possible presence of errors in the byte stream encoding. This causes unexpected and often severe problems attempting to use existing data in a system that uses UTF-16 as an internal encoding. Results are security bugs, DoS";
float color[4] = {1.0, 1.0, 1.0, 1};
float pos[2] = {0, 0}, center[3] = {0, 0, 0};
uint i, length;
char character;
static uint progress = 0;
static float height = 0, time;
STextBlockMode mode;
if(input->mode == BAM_MAIN)
seduce_animate(input, &time, input->pointers[0].button[0], 1.5);
if(input->mode == BAM_DRAW)
{
pos[0] = x;
if(pos[0] > 0.85)
pos[0] = 0.85;
if(pos[0] < -0.85)
pos[0] = -0.85;
pos[1] = y;
pos[1] += height;
for(i = 0; t[i] != 0; i++)
text[i] = t[i];
text[i] = 0;
seduce_text_line_draw(NULL, pos[0] - seduce_text_line_length(NULL, SEDUCE_T_SIZE * 0.5, SEDUCE_T_SPACE, tooltip, -1), pos[1], SEDUCE_T_SIZE, SEDUCE_T_SPACE, tooltip, 0.2, 0.6, 1.0, 1.0, -1);
/* seduce_background_quad_draw(input, NULL, 0, pos[0] - 0.115, pos[1] + 0.02, 0,
pos[0] + 0, pos[1] + 0.03, 0,
pos[0] + 0, pos[1] - 0.33, 0,
pos[0] - 0.115, pos[1] - 0.32, 0,
-0.1, -0.2, 1,
0, 0, 0, 0.7);
seduce_background_quad_draw(input, NULL, 0, pos[0] - 0, pos[1] + 0.03, 0,
pos[0] + 0.115, pos[1] + 0.02, 0,
pos[0] + 0.115, pos[1] - 0.32, 0,
pos[0] - 0, pos[1] - 0.33, 0,
-0.1, -0.2, 1,
0, 0, 0, 0.7);*/
//extern SeduceBackgroundObject *seduce_background_object_allocate();
//extern void seduce_background_shadow_add(SeduceBackgroundObject *object, float *list, uint count, boolean closed, float size);
center[0] = pos[0];
center[1] = pos[1] - 0.13;
if(input->pointers[0].button[0] && !input->pointers[0].last_button[0] && input->draw_id == 0)
seduce_background_particle_burst(input, center[0], center[1], 20, 0.2, S_PT_SPLAT_ONE);
seduce_background_polygon_flush(input, center, time);
color[3] = time * time;
mode.character_position = 0;
mode.font = NULL;
mode.red = 1.0;
mode.green = 1.0;
mode.blue = 1.0;
mode.alpha = 1.0;
mode.letter_size = SEDUCE_T_SIZE;
mode.letter_spacing = SEDUCE_T_SPACE;
seduce_text_block_draw(pos[0] - 0.1, pos[1], 0.2, 1.0, SEDUCE_T_LINE_SPACEING, SEDUCE_TBAS_STRETCH, text, 0, &mode, 1);
// i = seduce_text_block_draw_old(pos[0] - 0.1, pos[1], SEDUCE_T_SIZE, SEDUCE_T_SPACE, 0.2, SEDUCE_T_LINE_SPACEING, 2, SEDUCE_TBAS_STRETCH, text, 0, color, NULL, NULL, NULL, NULL);
pos[1] -= SEDUCE_T_SIZE * SEDUCE_T_LINE_SPACEING;
length = seduce_text_line_length(NULL, 1, SEDUCE_T_SPACE, tooltip, -1);
pos[1] -= 2.0 * 0.2 / length;
seduce_text_line_draw(NULL, pos[0] - 0.1, pos[1], 0.2 / length, SEDUCE_T_SPACE, tooltip, 0.2, 0.6, 1.0, 1.0, -1);
pos[1] -= SEDUCE_T_SIZE * SEDUCE_T_LINE_SPACEING;
// i = seduce_text_block_draw_old(pos[0] - 0.1, pos[1], SEDUCE_T_SIZE, SEDUCE_T_SPACE, 0.2, SEDUCE_T_LINE_SPACEING, i, SEDUCE_TBAS_STRETCH, &text[i], 0, color, NULL, NULL, NULL, NULL);
}
// height = (height * 0.99) + (float)i * SEDUCE_T_SIZE * 2.0 * 0.01;
}
void seduce_background_circle_draw(BInputState *input, float pos_x, float pos_y, uint splits, float timer, uint selected);
#define SEDUCE_DEMO_TOGGLE 8
boolean seduce_demo_toggle[SEDUCE_DEMO_TOGGLE] = {TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE};
void seduce_test_popup_func(BInputState *input, float time, void *user)
{
static boolean toggle[8] = {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE};
float vec[2];
uint i;
char *names[SEDUCE_DEMO_TOGGLE];
names[0] = seduce_translate("Show Widget Demo");
names[1] = seduce_translate("Draw Image");
names[2] = seduce_translate("Draw Icon list");
names[3] = seduce_translate("Draw Exclamation Star Field");
names[4] = seduce_translate("Show Betray settings");
names[5] = seduce_translate("Show Seduce Color settings");
names[6] = seduce_translate("Draw Vanishing point");
names[7] = seduce_translate("Draw Background");
for(i = 0; i < SEDUCE_DEMO_TOGGLE; i++)
{
vec[0] = sin((float)i * PI * 2.0 / 8.0) * 0.3;
vec[1] = cos((float)i * PI * 2.0 / 8.0) * 0.3;
seduce_widget_toggle_icon(input, &seduce_demo_toggle[i], &seduce_demo_toggle[i], SUI_3D_OBJECT_CHECKBOXCHECKED, vec[0], vec[1], 0.1, time);
seduce_text_line_draw(NULL, vec[0] + seduce_text_line_length(NULL, SEDUCE_T_SIZE, SEDUCE_T_SPACE, names[i], -1) * -0.5, vec[1] - 0.07, SEDUCE_T_SIZE, SEDUCE_T_SPACE, names[i], 1, 1, 1, 0.7 * time, -1);
}
}
extern void seduce_color_settings(BInputState *input, boolean active);
boolean seduce_background_shape_draw2(BInputState *input, void *id, float a_x, float a_y, float b_x, float b_y, float c_x, float c_y, float d_x, float d_y, float timer, float normal_x, float normal_y, float *center);
void r_matrix_projection_screenf_new(RMatrix *matrix, float *output, float x, float y, float z);
void seduce_element_test(BInputState *input, void *user_pointer)
{
RMatrix matrix;
static float timer = 0, *t, amnimation = 0, background_animation = 0;
float aspect, pos[3];
uint i, j;
if(input->mode == BAM_MAIN)
{
timer += input->delta_time * 0.01;
if(!seduce_demo_toggle[0])
{
amnimation -= input->delta_time * 2.0;
if(amnimation < 0.0)
amnimation = 0.0;
}else
{
amnimation += input->delta_time * 2.0;
if(amnimation > 1.0)
amnimation = 1.0;
}
if(!seduce_demo_toggle[7])
{
background_animation -= input->delta_time;
if(background_animation < 0.0)
background_animation = 0.0;
}else
{
background_animation += input->delta_time;
if(background_animation > 1.0)
background_animation = 1.0;
}
}
t = &timer;
if(betray_button_get(0, BETRAY_BUTTON_Q))
exit(0);
{
static float value = 0.5, c[4] = {1, 1, 1, 1};
static uint selected = 0;
static boolean toggle[2] = {FALSE, FALSE};
static uint button;
char *lables[14] = {"An option", "A selection", "A thing", "Something Else", "Not much", "Slightly more", "7 Hej", "8 Hej", "9 Hopp", "10 Hej", "11 Hopp", "12 Hej", "13 Hopp", "14 Hej"}, *t;
static float m[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, -0.3, 1};
static float m2[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
static float m3[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
static float center[3] = {0.2, 0.2, 0}, manip_point[3] = {0.5, 0, 0}, manip_point2[3] = {1, 0, 0}, manip_point3[6] = {0.0, 0, 0, 0.5, 0.3, 0}, manip_point4[6] = {-0.5, -0.3, -0.4, 0.5, 0.3, 0.4}, manip_size[3] = {1, 1, 1};
static char text[32] = {0};
static char password[32] = {0};
static double dvalue = 0;
static int ivalue = 0;
static uint uvalue = 0;
float view[3] = {0.0, 0.0, 1};
uint x, y;
if(input->mode == BAM_DRAW)
{
glClearColor(0.0, 0.0, 0.0, 0);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
}
r_matrix_identity(&matrix);
aspect = betray_screen_mode_get(&x, &y, NULL);
r_viewport(0, 0, x, y);
/* view[0] = input->pointers[0].pointer_x;
view[1] = input->pointers[0].pointer_y;*/
// betray_view_vantage(view);
r_matrix_frustum(&matrix, -0.01 - view[0] * 0.01, 0.01 - view[0] * 0.01, -0.01 * aspect - view[1] * 0.01, 0.01 * aspect - view[1] * 0.01, 0.01 * view[2], 100.0); /* set frustum */
r_matrix_translate(&matrix, -view[0], -view[1], -view[2]); /* move camera bac so we can see Z plane*/
r_matrix_set(&matrix);
/* t = seduce_translate("Welcome to the Seduce demo! Press the right mouse button, or put five fingers on the touch screen to activate the Popup Menu where you can toggle on or off all interface elements.");
for(i = 0; i < 8 && !seduce_demo_toggle[i]; i++);
if(i == 8)
seduce_text_block_draw_old(-0.125, 0.25, SEDUCE_T_SIZE, SEDUCE_T_SPACE, 0.25, 3.0, 10, SEDUCE_TBAS_STRETCH, t, 0, c, NULL, NULL, NULL, NULL);
*/
if(seduce_demo_toggle[6])
{
for(i = 0; i < 21; i++)
{
r_primitive_line_3d(1, (float)i * 0.1 - 1.0, -1000.0, 1, (float)i * 0.1 - 1.0, 0, 1, 1, 1, 0.3);
r_primitive_line_3d(-1, (float)i * 0.1 - 1.0, -1000.0, -1, (float)i * 0.1 - 1.0, 0, 1, 1, 1, 0.3);
}
r_primitive_line_flush();
}
/* {
static uint texture_id = -1;
if(texture_id == -1)
texture_id = gather_file_opengl_texture("image3.tga", G_FORMAT_TARGA_SIMPLE);
if(background_animation > 0.001)
{
r_matrix_push(&matrix);
r_matrix_translate(&matrix, 0, 0, -1);
seduce_background_image_draw(input, m, -2.2, -1.1, 4.4, 2.2, 0.0, 0.0, 1.0, 1.0, background_animation, center, texture_id);
r_matrix_pop(&matrix);
}
}*/
r_matrix_push(&matrix);
r_matrix_matrix_mult(NULL, m);
/* if(seduce_demo_toggle[1])
{
static uint texture_id = -1;
if(texture_id == -1)
texture_id = gather_file_opengl_texture("image.tga", G_FORMAT_TARGA_SIMPLE);
seduce_background_image_draw(input, m, -0.2, -0.2, 0.4, 0.4, 0.0, 0.0, 1.0, 1.0, 1, center, texture_id);
}*/
if(seduce_demo_toggle[2])
for(i = 0; i < SUI_3D_OBJECT_COUNT; i++)
seduce_object_3d_draw(input, 0.1 * (i / 6) - 0.6, 0.1 * (i % 6) - 0.4, 0, 0.05, i, FALSE, NULL);
if(seduce_demo_toggle[3])
for(i = 0; i < SUI_3D_OBJECT_COUNT; i++)
seduce_object_3d_draw(input, f_randnf(i * 3 + 0), f_randnf(i * 3 + 1), f_randnf(i * 3 + 2) * 0.99, 0.05, SUI_3D_OBJECT_MARKER, FALSE, NULL);
seduce_background_shape_matrix_interact(input, m, m, TRUE, TRUE);
r_matrix_pop(&matrix);
if(amnimation > 0.001)
{
float f;
r_matrix_push(&matrix);
r_matrix_rotate(&matrix, (value - 0.5) * 360.0, 1, 1, 0.2);
r_matrix_matrix_mult(&matrix, m3);
seduce_background_square_draw(input, m3, -0.2, -0.4, 0.4, 0.8, 0.5, 0.1, amnimation);
seduce_background_shape_matrix_interact(input, m3, m3, TRUE, TRUE);
/* {
float test[3];
r_matrix_projection_surfacef(&matrix, test, 2, input->pointers[0].pointer_x, input->pointers[0].pointer_y);
// r_matrix_projection_axisf(&matrix, test, 0, input->pointers[0].pointer_x, input->pointers[0].pointer_y);
seduce_object_3d_draw(input, test[0], test[1], test[2], 0.2, SUI_3D_OBJECT_MARKER, FALSE, NULL);
}*/
/* seduce_widget_slider_radial(input, 0.1, 0.15, 0.1, 0.5, amnimation, &c[0], &c[1], c[0], c[1], c[2], c[0], c[1], c[2]);
seduce_widget_slider_radial(input, 0.1, 0.0, 0.1, 0.5, amnimation, &c[1], &c[2], c[0], c[1], c[2], c[0], c[1], c[2]);
seduce_widget_slider_radial(input, 0.1, -0.15, 0.1, 0.5, amnimation, &c[2], &c[3] ,c[0], c[1], c[2], c[0], c[1], c[2]);
seduce_widget_slider_radial(input, &value, &value, 0.1, -0.3, 0.1, 0.5, 0, 1, amnimation, TRUE, NULL);
*/
seduce_popup_detect_icon(input, seduce_test_popup_func, SUI_3D_OBJECT_STOP, 0.5, 0.0, 0.1, amnimation, seduce_test_popup_func, NULL, TRUE, NULL);
seduce_widget_color_wheel_radial(input, c, c, -0.1, 0.15, 0.1, 0.5, amnimation);
// seduce_widget_button_icon(input, center, SUI_3D_OBJECT_MESSAGE, -0.1, -0.15, 0.1, amnimation);
seduce_widget_toggle_icon(input, &toggle[1], &toggle[1], SUI_3D_OBJECT_CHECKBOXCHECKED, -0.1, -0.3, 0.1, amnimation);
seduce_widget_select_radial(input, &selected, &selected, lables, 6, S_PUT_ANGLE, -0.1, 0.0, 0.1, 0.5, amnimation, TRUE);
f = 0.2;
seduce_background_shape_draw2(input, NULL, -0.01, f + -0.01, 0.2, f + -0.02, 0.2, f + 0.04, -0.01, f + 0.03, amnimation, 0.1, 0.0, center);
seduce_text_edit_line(input, text, NULL, text, 32, 0.01, f + 0, 0.18, 0.01, "type something", TRUE, NULL, NULL, 1, 1, 1, 0.8, 0.0, 0.0, 0.0, 1.6);
f = 0.1;
seduce_background_shape_draw2(input, NULL, -0.01, f + -0.01, 0.2, f + -0.02, 0.2, f + 0.04, -0.01, f + 0.03, amnimation, 0.1, 0.0, center);
seduce_text_edit_obfuscated(input, password, password, 32, 0.01, f + 0, 0.18, 0.01, "Password", TRUE, NULL, NULL, 1, 1, 1, 0.8, 0.0, 0.0, 0.0, 1.6);
f = 0.0;
seduce_background_shape_draw2(input, NULL, -0.01, f + -0.01, 0.2, f + -0.02, 0.2, f + 0.04, -0.01, f + 0.03, amnimation, 0.1, 0.0, center);
seduce_text_edit_double(input, &dvalue, NULL, &dvalue, 0.01, f + 0, 0.18, 0.01, TRUE, NULL, NULL, 1, 1, 1, 0.8, 0.0, 0.0, 0.0, 1.6);
f = -0.1;
seduce_background_shape_draw2(input, NULL, -0.01, f + -0.01, 0.2, f + -0.02, 0.2, f + 0.04, -0.01, f + 0.03, amnimation, 0.1, 0.0, center);
seduce_text_edit_int(input, &ivalue, NULL, &ivalue, 0.01, f + 0, 0.18, 0.01, TRUE, NULL, NULL, 1, 1, 1, 0.8, 0.0, 0.0, 0.0, 1.6);
f = -0.2;
seduce_background_shape_draw2(input, NULL, -0.01, f + -0.01, 0.2, f + -0.02, 0.2, f + 0.04, -0.01, f + 0.03, amnimation, 0.1, 0.0, center);
seduce_text_edit_uint(input, &uvalue, NULL, &uvalue, 0.01, f + 0, 0.18, 0.01, TRUE, NULL, NULL, 1, 1, 1, 0.8, 0.0, 0.0, 0.0, 1.6);
// r_matrix_scale(NULL, 0.3, 1, 1);
/* seduce_manipulator_point(input, NULL, manip_point, manip_point, 1);
f_normalize3f(manip_point);
manip_point[0] *= 0.25;
manip_point[1] *= 0.25;
manip_point[2] *= 0.25;*/
seduce_manipulator_pos_xyz(input, NULL, manip_point, manip_point, NULL, FALSE, TRUE, TRUE, TRUE, 1, amnimation);
// seduce_manipulator_point_plane(input, NULL, manip_point2, manip_point2, NULL, FALSE, 2, 1);
// seduce_manipulator_normal(input, NULL, manip_point, manip_point2, manip_point2, 1);
seduce_manipulator_radius(input, NULL, manip_point, manip_point2, manip_point2, amnimation);
seduce_manipulator_scale(input, NULL, manip_point, manip_size, manip_size, NULL, FALSE, TRUE, TRUE, TRUE, 1, amnimation);
// seduce_manipulator_point_axis(input, NULL, manip_point2, manip_point2, NULL, FALSE, 0, 1);
r_primitive_line_3d(manip_point2[0], manip_point2[1], manip_point2[2], 0, manip_point2[1], manip_point2[2], 1, 1, 1, 1);
r_primitive_line_3d(0, manip_point2[1], manip_point2[2], 0, 0, manip_point2[2], 1, 1, 1, 1);
r_primitive_line_3d(manip_point2[0], manip_point2[1], manip_point2[2], manip_point2[0], 0, manip_point2[2], 1, 1, 1, 1);
r_primitive_line_3d(manip_point2[0], 0, manip_point2[2], 0, 0, manip_point2[2], 1, 1, 1, 1);
r_primitive_line_3d(manip_point2[0], manip_point2[1], 0, 0, manip_point2[1], 0, 1, 1, 1, 1);
r_primitive_line_3d(0, manip_point2[1], 0, 0, 0, 0, 1, 1, 1, 1);
r_primitive_line_3d(manip_point2[0], manip_point2[1], 0, manip_point2[0], 0, 0, 1, 1, 1, 1);
r_primitive_line_3d(manip_point2[0], 0, 0, 0, 0, 0, 1, 1, 1, 1);
r_primitive_line_3d(manip_point2[0], manip_point2[1], manip_point2[2], manip_point2[0], manip_point2[1], 0, 1, 1, 1, 1);
r_primitive_line_3d(0, manip_point2[1], manip_point2[2], 0, manip_point2[1], 0, 1, 1, 1, 1);
r_primitive_line_3d(0, 0, manip_point2[2], 0, 0, 0, 1, 1, 1, 1);
r_primitive_line_3d(manip_point2[0], 0, manip_point2[2], manip_point2[0], 0, 0, 1, 1, 1, 1);
r_primitive_line_flush();
seduce_manipulator_square_cornered(input, NULL, manip_point3, &manip_point3[3], manip_point3, NULL, FALSE, input->pointers[0].button[1], 1, amnimation);
r_primitive_line_3d(manip_point3[0], manip_point3[1], manip_point3[2],
manip_point3[0], manip_point3[4], manip_point3[2], 1, 1, 1, 1);
r_primitive_line_3d(manip_point3[3], manip_point3[1], manip_point3[2],
manip_point3[3], manip_point3[4], manip_point3[2], 1, 1, 1, 1);
seduce_manipulator_cube_cornered(input, NULL, manip_point4, &manip_point4[3], manip_point4, NULL, FALSE, 0.3, amnimation);
r_primitive_line_3d(manip_point4[3],
manip_point4[4],
manip_point4[5],
manip_point4[3],
manip_point4[4],
manip_point4[2], 1, 0, 0, 1);
r_primitive_line_3d(manip_point4[0],
manip_point4[4],
manip_point4[5],
manip_point4[0],
manip_point4[4],
manip_point4[2], 1, 0, 0, 1);
r_primitive_line_3d(manip_point4[0],
manip_point4[1],
manip_point4[5],
manip_point4[0],
manip_point4[1],
manip_point4[2], 1, 0, 0, 1);
r_primitive_line_3d(manip_point4[3],
manip_point4[1],
manip_point4[5],
manip_point4[3],
manip_point4[1],
manip_point4[2], 1, 0, 0, 1);
r_primitive_line_3d(manip_point[0],
manip_point[1],
manip_point[2],
0,
0,
0, 0, 1, 0, 1);
r_primitive_line_3d(manip_point[0],
0,
0,
0,
0,
0, 0, 1, 0, 1);
r_primitive_line_3d(manip_point[0],
manip_point[1],
0,
manip_point[0],
0,
0, 0, 1, 0, 1);
r_primitive_line_3d(manip_point[0],
manip_point[1],
manip_point[2],
manip_point[0],
manip_point[1],
0, 0, 1, 0, 1);
r_primitive_line_flush();
if(input->mode == BAM_DRAW)
{
RMatrix m2;
float test[3], test2[3], point[3];
for(i = 0; i < 5; i++)
{
point[0] = 0.5;
point[1] = 0;
point[2] = (float)i * 0.2;
r_primitive_line_3d(point[0] + 0.1, point[1], point[2], point[0], point[1], point[2], 1, 0, 0, 1.1);
r_primitive_line_3d(point[0], point[1] + 0.1, point[2], point[0], point[1], point[2], 0, 1, 0, 1.1);
r_primitive_line_3d(point[0], point[1], point[2] + 0.1, point[0], point[1], point[2], 0, 0, 1, 1.1);
r_primitive_line_flush();
// r_matrix_projection_screenf(NULL, test, point[0], point[1], point[2]);
r_matrix_projection_screenf(NULL, test2, point[0], point[1], point[2]);
/* r_matrix_set(&m2);
r_matrix_identity(&m2);
r_matrix_frustum(&m2, -0.01, 0.01, -0.01 * aspect, 0.01 * aspect, 0.01, 10.0);
r_matrix_translate(&m2, 0, 0, -1);
r_primitive_line_3d(test[0] + 0.1, test[1], 0, test[0], test[1], 0, 0, 1, 1, 1.1);
r_primitive_line_3d(test[0], test[1] + 0.1, 0, test[0], test[1], 0, 1, 0, 1, 1.1);
r_primitive_line_3d(test[0], test[1], 0.1, test[0], test[1], 0, 1, 1, 0, 1.1);
r_primitive_line_3d(test2[0], test2[1], 0, test2[0] - 0.2, test2[1], 0, 0, 1, 1, 1.1);
r_primitive_line_3d(test2[0], test2[1], 0, test2[0], test2[1] - 0.2, 0, 1, 0, 1, 1.1);
r_primitive_line_3d(test2[0], test2[1], 0, test2[0], test2[1], -0.2, 1, 1, 0, 1.1);
r_primitive_line_flush();
r_matrix_set(&matrix);*/
r_matrix_projection_worldf(NULL, test2, test2[0], test2[1], test2[2]);
r_primitive_line_3d(test2[0], test2[1], test2[2], test2[0] - 0.1, test2[1], test2[2], 0, 1, 1, 1.1);
r_primitive_line_3d(test2[0], test2[1], test2[2], test2[0], test2[1] - 0.1, test2[2], 1, 0, 1, 1.1);
r_primitive_line_3d(test2[0], test2[1], test2[2], test2[0], test2[1], test2[2] - 0.1, 1, 1, 0, 1.1);
r_primitive_line_flush();
r_matrix_set(&matrix);
}
}
r_matrix_pop(&matrix);
}
// seduce_betray_settings(input, seduce_demo_toggle[4]);
// seduce_color_settings(input, seduce_demo_toggle[5]);
// seduce_background_shape_draw2(input, NULL, 0, 0, 0.1, 0, 0.1, 0.01, 0, 0.01, 1, 0, 0, NULL);
// t = "Although Hilary Mantel is apparently yet to begin the third volume of her trilogy of novels about Thomas Cromwell, we can be confident of several plot twists that it will not feature. Cromwell will not precipitate a civil war. He will not betray the husband of his foster-sister, with whom he is in love. He will not escape the executioner's block. His downfall is scripted. The history books cannot be cheated. Mantel's Cromwell is as bound to the inevitability of his doom as any prisoner to a rack.";
// seduce_text_block_draw_old(0.3, -0.25, 0.01, SEDUCE_T_SPACE, 0.25, 2.0, 10, SEDUCE_TBAS_STRETCH, t, 0, c, NULL, NULL, NULL, NULL);
/* {
float output[2];
seduce_element_add_surface(input, &c[0]);
seduce_element_surface_project(input, &c[0], output, input->pointers[0].pointer_x, input->pointers[0].pointer_y);
seduce_widget_button_icon(input, center, SUI_3D_OBJECT_MESSAGE, output[0], output[1], 0.1, amnimation);
}*/
/* {
static float time = 0;
char *lables[14] = {"Hej", "Hopp", "Hej", "Hopp", "Hej", "Hopp", "Hej", "Hej", "Hopp", "Hej", "Hopp", "Hej", "Hopp", "Hej"};
seduce_popup_simple(input, 0, input->pointers[0].click_pointer_x[1], input->pointers[0].click_pointer_y[1], lables, 14, &time, input->pointers[0].button[1], 0.1, 0.1, 0.1, 1.0, 1.0, 1.0);
}*/
/* {
static float value, c[4] = {1, 1, 1, 1};
s_widget_slider_new(input, -0.1, 0, 0.1, 0, 1, amnimation, &value, &value, c, c, c, c);
}*/
{
float red[4] = {1.0, 0.1, 0.3, 1.0};
if(seduce_widget_button_icon(input, &button, SUI_3D_OBJECT_CLOSE, -0.97, aspect - 0.03, 0.02, 1, red))
{
seduce_translate_save("seduce_language_translation.txt");
exit(0);
}
}
}
/* if(input->mode == BAM_DRAW)
seduce_element_make_sure();*/
if(input->mode == BAM_DRAW)
glEnable(GL_DEPTH_TEST);
seduce_popup_detect_multitouch(input, NULL, 5, seduce_test_popup_func, NULL);
seduce_popup_detect_mouse(input, NULL, 1, seduce_test_popup_func, NULL);
seduce_popup_detect_axis(input, BETRAY_BUTTON_FACE_Y, seduce_test_popup_func, NULL);
seduce_element_endframe(input, FALSE);
if(input->mode == BAM_EVENT)
{
void *id;
id = seduce_element_pointer_id(input, 0, NULL);
i = seduce_element_pointer(input, id, NULL);
SSortStorage.action_computed = FALSE;
}
}