forked from enlightenment/efl
204 lines
6.2 KiB
C
204 lines
6.2 KiB
C
#include "primitive_common.h"
|
|
|
|
void _set_vertex_data_from_array(Evas_Canvas3D_Mesh *mesh,
|
|
int frame,
|
|
const float *data,
|
|
Evas_Canvas3D_Vertex_Attrib attr,
|
|
int start,
|
|
int attr_count,
|
|
int line,
|
|
int vcount)
|
|
{
|
|
float *address, *out;
|
|
int stride, i, j;
|
|
evas_canvas3d_mesh_frame_vertex_data_copy_set(mesh, frame, attr, 0, NULL);
|
|
address = (float *)evas_canvas3d_mesh_frame_vertex_data_map(mesh, frame, attr);
|
|
stride = evas_canvas3d_mesh_frame_vertex_stride_get(mesh, frame, attr);
|
|
if (stride == 0) stride = sizeof(float) * attr_count;
|
|
for (i = 0; i < vcount; i++)
|
|
{
|
|
out = (float *)((char *)address + stride * i);
|
|
for (j = 0; j < attr_count; j++)
|
|
out[j] = data[start + (line * i) + j];
|
|
}
|
|
evas_canvas3d_mesh_frame_vertex_data_unmap(mesh, frame, attr);
|
|
}
|
|
|
|
void
|
|
_set_vec3_vertex_data(Evas_Canvas3D_Mesh *mesh,
|
|
int frame,
|
|
int vcount,
|
|
Eina_Vector3 *data,
|
|
Evas_Canvas3D_Vertex_Attrib attr)
|
|
{
|
|
float *address, *out;
|
|
int stride, i;
|
|
evas_canvas3d_mesh_frame_vertex_data_copy_set(mesh, frame, attr, 0, NULL);
|
|
address = (float *)evas_canvas3d_mesh_frame_vertex_data_map(mesh, frame, attr);
|
|
stride = evas_canvas3d_mesh_frame_vertex_stride_get(mesh, frame, attr);
|
|
if (stride == 0) stride = sizeof(float) * 3;
|
|
for (i = 0; i < vcount; i++)
|
|
{
|
|
out = (float *)((char *)address + stride * i);
|
|
out[0] = data[i].x;
|
|
out[1] = data[i].y;
|
|
out[2] = data[i].z;
|
|
}
|
|
free(data);
|
|
evas_canvas3d_mesh_frame_vertex_data_unmap(mesh, frame, attr);
|
|
}
|
|
|
|
void
|
|
_set_vec2_vertex_data(Evas_Canvas3D_Mesh *mesh,
|
|
int frame,
|
|
int vcount,
|
|
Eina_Vector2 *data,
|
|
Evas_Canvas3D_Vertex_Attrib attr)
|
|
{
|
|
float *address, *out;
|
|
int stride, i;
|
|
evas_canvas3d_mesh_frame_vertex_data_copy_set(mesh, frame, attr, 0, NULL);
|
|
address = (float *)evas_canvas3d_mesh_frame_vertex_data_map(mesh, frame, attr);
|
|
stride = evas_canvas3d_mesh_frame_vertex_stride_get(mesh, frame, attr);
|
|
if (stride == 0) stride = sizeof(float) * 2;
|
|
for (i = 0; i < vcount; i++)
|
|
{
|
|
out = (float *)((char *)address + stride * i);
|
|
out[0] = data[i].x;
|
|
out[1] = data[i].y;
|
|
}
|
|
free(data);
|
|
evas_canvas3d_mesh_frame_vertex_data_unmap(mesh, frame, attr);
|
|
}
|
|
|
|
void
|
|
_generate_indices(unsigned short *indices, int a, int b)
|
|
{
|
|
int i, j, a1 = a + 1;
|
|
unsigned short *index = &indices[0];
|
|
|
|
for (i = 0; i < b; i++)
|
|
{
|
|
for (j = 0; j < a; j++)
|
|
{
|
|
*index++ = j + a1 * i;
|
|
*index++ = j + a1 * (i + 1);
|
|
*index++ = j + 1 + a1 * (i + 1);
|
|
|
|
*index++ = j + a1 * i;
|
|
*index++ = j + 1 + a1 * i;
|
|
*index++ = j + a1 * (i + 1) + 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
_primitives_vec3_copy(Eina_Vector3 *dst, const Eina_Vector3 *src)
|
|
{
|
|
dst->x = src->x;
|
|
dst->y = src->y;
|
|
dst->z = src->z;
|
|
}
|
|
|
|
void
|
|
_primitives_vec3_subtract(Eina_Vector3 *out, const Eina_Vector3 *a, const Eina_Vector3 *b)
|
|
{
|
|
out->x = a->x - b->x;
|
|
out->y = a->y - b->y;
|
|
out->z = a->z - b->z;
|
|
}
|
|
|
|
void
|
|
_primitives_vec3_cross_product(Eina_Vector3 *out, const Eina_Vector3 *a, const Eina_Vector3 *b)
|
|
{
|
|
Eina_Vector3 tmp;
|
|
|
|
tmp.x = a->y * b->z - a->z * b->y;
|
|
tmp.y = a->z * b->x - a->x * b->z;
|
|
tmp.z = a->x * b->y - a->y * b->x;
|
|
|
|
_primitives_vec3_copy(out, &tmp);
|
|
}
|
|
|
|
void
|
|
_primitives_vec3_normalize(Eina_Vector3 *out)
|
|
{
|
|
Evas_Real size = out->x * out->x + out->y *out->y + out->z * out->z;
|
|
size = sqrt(size);
|
|
out->x /= size;
|
|
out->y /= size;
|
|
out->z /= size;
|
|
}
|
|
|
|
void
|
|
evas_common_set_model_from_primitive(Evas_Canvas3D_Mesh *model,
|
|
int frame,
|
|
Evas_Canvas3D_Primitive_Data *primitive)
|
|
{
|
|
Evas_Real ratio = primitive->ratio;
|
|
int precision = primitive->precision;
|
|
Evas_Canvas3D_Surface_Func *surface = primitive->surface;
|
|
Eina_Vector2 tex_scale = primitive->tex_scale;
|
|
Evas_Canvas3D_Primitive_Mode mode = primitive->mode;
|
|
|
|
switch (primitive->form)
|
|
{
|
|
case EVAS_CANVAS3D_MESH_PRIMITIVE_NONE:
|
|
case EVAS_CANVAS3D_MESH_PRIMITIVE_COUNT:
|
|
{
|
|
ERR("Primitive with this type cannot be set to mesh.");
|
|
break;
|
|
}
|
|
case EVAS_CANVAS3D_MESH_PRIMITIVE_SQUARE:
|
|
{
|
|
evas_model_set_from_square_primitive(model, frame);
|
|
break;
|
|
}
|
|
case EVAS_CANVAS3D_MESH_PRIMITIVE_CUBE:
|
|
{
|
|
evas_model_set_from_cube_primitive(model, frame);
|
|
break;
|
|
}
|
|
case EVAS_CANVAS3D_MESH_PRIMITIVE_CYLINDER:
|
|
{
|
|
evas_model_set_from_cylinder_primitive(model, frame, mode,
|
|
precision, tex_scale);
|
|
break;
|
|
}
|
|
case EVAS_CANVAS3D_MESH_PRIMITIVE_CONE:
|
|
{
|
|
evas_model_set_from_cone_primitive(model, frame, mode,
|
|
precision, tex_scale);
|
|
break;
|
|
}
|
|
case EVAS_CANVAS3D_MESH_PRIMITIVE_SPHERE:
|
|
{
|
|
evas_model_set_from_sphere_primitive(model, frame, mode,
|
|
precision, tex_scale);
|
|
break;
|
|
}
|
|
case EVAS_CANVAS3D_MESH_PRIMITIVE_TORUS:
|
|
{
|
|
evas_model_set_from_torus_primitive(model, frame,
|
|
ratio, precision, tex_scale);
|
|
break;
|
|
}
|
|
case EVAS_CANVAS3D_MESH_PRIMITIVE_SURFACE:
|
|
{
|
|
evas_model_set_from_surface_primitive(model, frame,
|
|
surface, precision, tex_scale);
|
|
break;
|
|
}
|
|
case EVAS_CANVAS3D_MESH_PRIMITIVE_TERRAIN:
|
|
{
|
|
evas_model_set_from_terrain_primitive(model, frame,
|
|
precision, tex_scale);
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
ERR("Unknown type of primitive");
|
|
}
|
|
}
|
|
}
|