diff options
-rw-r--r-- | src/gizmo/visualize.c | 76 | ||||
-rw-r--r-- | src/gizmo/visualize.h | 17 | ||||
-rw-r--r-- | src/util/darray.c | 39 | ||||
-rw-r--r-- | src/util/darray.h | 24 |
4 files changed, 156 insertions, 0 deletions
diff --git a/src/gizmo/visualize.c b/src/gizmo/visualize.c new file mode 100644 index 0000000..485e6c6 --- /dev/null +++ b/src/gizmo/visualize.c @@ -0,0 +1,76 @@ +#include "visualize.h" +#include "../shaders/common/core.h" + +// varying +#define _color reg_v4_00 +static void vert( Vertex* in, Vec4* clipcoord) { + static Vec4 p; p.xyz = in->position; p.w = 1; + object2clip(&p, clipcoord); + color_tocolor32(in->color, _color); +} +static bool frag( Color32* color) { + *color = *_color; + return 1; +} +static Program line_shader = { + vert, frag, + VARYING_V4_00 +}; + +void draw_tbn(Mesh* mesh, uint mask, int length) { + Color COLOR_RED = 0xffff0000; + Color COLOR_GREEN = 0xff00ff00; + Color COLOR_BLUE = 0xff0000ff; + Vertex* vert_list = NULL; + int vert_index = 0; + int* lines = NULL; + for (int i = 0; i < mesh->vert_count; ++i) { + Vertex* vert = &mesh->vertices[i]; + Vec3 normal = vert->normal; + Vec4 tangent = vert->tangent; + //Vec4 tangent = vec4(1,0,0,1); + if (mask & VISUAL_NORMAL) + { + Vertex v0 = { vert_index++, vert->position, vec3zero, vec4zero, vec2zero, COLOR_BLUE }; + Vertex v1 = { vert_index++, vec3_plus(vert->position, vec3_scale(normal, length)), vec3zero, vec4zero, vec2zero, COLOR_BLUE }; + darray_push(vert_list, v0); + darray_push(vert_list, v1); + darray_push(lines, vert_index - 2); + darray_push(lines, vert_index - 1); + } + if (mask & VISUAL_TANGNET) + { + Vertex v0 = { vert_index++, vert->position, vec3zero, vec4zero, vec2zero, COLOR_RED }; + Vertex v1 = { vert_index++, vec3_plus(vert->position, vec3_scale(tangent.xyz, length)), vec3zero, vec4zero, vec2zero, COLOR_RED }; + darray_push(vert_list, v0); + darray_push(vert_list, v1); + darray_push(lines, vert_index - 2); + darray_push(lines, vert_index - 1); + } + if (mask & VISUAL_BITANGENT) + { + Vec3 bitangent = vec3_cross(normal, tangent.xyz); + Vertex v0 = { vert_index++, vert->position, vec3zero, vec4zero, vec2zero, COLOR_GREEN }; + Vertex v1 = { vert_index++, vec3_plus(vert->position, vec3_scale(bitangent, length)), vec3zero, vec4zero, vec2zero, COLOR_GREEN }; + darray_push(vert_list, v0); + darray_push(vert_list, v1); + darray_push(lines, vert_index - 2); + darray_push(lines, vert_index - 1); + } + } + ssr_bindvertices(vert_list, darray_size(vert_list)); + ssr_bindindices(lines, darray_size(lines)* 0.5f); + ssr_matrixmode(MATRIX_MODEL); + ssr_loadidentity(); + ssr_useprogram(&line_shader); + //ssr_disable(ENABLE_DEPTHTEST); + ssr_draw(PRIMITIVE_LINE); + ssr_unuseprogram(); + ssr_enable(ENABLE_WRITEDEPTH); + darray_free(vert_list); + darray_free(lines); +} + +void draw_wire(Mesh* mesh) { + +}
\ No newline at end of file diff --git a/src/gizmo/visualize.h b/src/gizmo/visualize.h new file mode 100644 index 0000000..c449e6a --- /dev/null +++ b/src/gizmo/visualize.h @@ -0,0 +1,17 @@ +#ifndef _SSR_VISUALIZE_H_ +#define _SSR_VISUALIZE_H_ + +#include "../core/device.h" +#include "../extend/mesh.h" +#include "../util/darray.h" + +enum { + VISUAL_TANGNET = 1, + VISUAL_NORMAL = 1 << 1, + VISUAL_BITANGENT = 1 << 2, + VISUAL_ALL = ~0u, +}; + +void draw_tbn(Mesh* mesh, uint mask, int length); + +#endif
\ No newline at end of file diff --git a/src/util/darray.c b/src/util/darray.c new file mode 100644 index 0000000..f117ccf --- /dev/null +++ b/src/util/darray.c @@ -0,0 +1,39 @@ +#include "assert.h" +#include "darray.h" + + +int darray_size(void *darray) { + return darray != NULL ? DARRAY_OCCUPIED(darray) : 0; +} + +void darray_free(void *darray) { + if (darray != NULL) { + free(DARRAY_RAW_DATA(darray)); + } +} + +void *darray_hold(void *darray, int count, int itemsize) { + assert(count > 0 && itemsize > 0); + if (darray == NULL) { + int raw_size = sizeof(int) * 2 + itemsize * count; + int *base = (int*)malloc(raw_size); + base[0] = count; /* capacity */ + base[1] = count; /* occupied */ + return base + 2; + } + else if (DARRAY_OCCUPIED(darray) + count <= DARRAY_CAPACITY(darray)) { + DARRAY_OCCUPIED(darray) += count; + return darray; + } + else { + int needed_size = DARRAY_OCCUPIED(darray) + count; + int double_curr = DARRAY_CAPACITY(darray) * 2; + int capacity = needed_size > double_curr ? needed_size : double_curr; + int occupied = needed_size; + int raw_size = sizeof(int) * 2 + itemsize * capacity; + int *base = (int*)realloc(DARRAY_RAW_DATA(darray), raw_size); + base[0] = capacity; + base[1] = occupied; + return base + 2; + } +} diff --git a/src/util/darray.h b/src/util/darray.h new file mode 100644 index 0000000..3347fd2 --- /dev/null +++ b/src/util/darray.h @@ -0,0 +1,24 @@ +#ifndef _SSR_DARRAY_H +#define _SSR_DARRAY_H + +#ifndef NULL +#define NULL 0 +#endif + +#define darray_push(darray, value) \ + do { \ + (darray) = darray_hold((darray), 1, sizeof(*(darray))); \ + (darray)[darray_size(darray) - 1] = (value); \ + } while (0) + +#define DARRAY_RAW_DATA(darray) ((int*)(darray) - 2) +#define DARRAY_CAPACITY(darray) (DARRAY_RAW_DATA(darray)[0]) +#define DARRAY_OCCUPIED(darray) (DARRAY_RAW_DATA(darray)[1]) + +int darray_size(void *darray); + +void darray_free(void *darray) ; + +void *darray_hold(void *darray, int count, int itemsize); + +#endif
\ No newline at end of file |