efl/src/lib/evas/common3d/primitives/primitive_common.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");
}
}
}