summaryrefslogtreecommitdiff
path: root/src/modules/evas/engines/gl_common
diff options
context:
space:
mode:
authorsubhransu <subhransu@subhransu-System.(none)>2014-04-14 19:03:47 +0900
committerChunEon Park <hermet@hermet.pe.kr>2014-04-14 19:09:21 +0900
commitb491b0399d8524a5f26019ae001efcf05296ec9a (patch)
treeb0aca7a55d2e7eef4b50f0064b153e93f10c5377 /src/modules/evas/engines/gl_common
parent631f526a79a6414dd6de6772fb9beaa860753eb1 (diff)
downloadefl-b491b0399d8524a5f26019ae001efcf05296ec9a.tar.gz
Evas_3D : Eolian change
Diffstat (limited to 'src/modules/evas/engines/gl_common')
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_3d.c148
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_3d_common.h2
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_3d_shader.c24
3 files changed, 105 insertions, 69 deletions
diff --git a/src/modules/evas/engines/gl_common/evas_gl_3d.c b/src/modules/evas/engines/gl_common/evas_gl_3d.c
index c41ffbfc26..71173d5a75 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_3d.c
+++ b/src/modules/evas/engines/gl_common/evas_gl_3d.c
@@ -702,7 +702,8 @@ e3d_drawable_format_get(E3D_Drawable *drawable)
static inline GLuint
_texture_id_get(Evas_3D_Texture *texture)
{
- E3D_Texture *tex = (E3D_Texture *)texture->engine_data;
+ Evas_3D_Texture_Data *pd = eo_data_scope_get(texture, EO_EVAS_3D_TEXTURE_CLASS);
+ E3D_Texture *tex = (E3D_Texture *)pd->engine_data;
return tex->tex;
}
@@ -713,8 +714,9 @@ _mesh_frame_find(Evas_3D_Mesh *mesh, int frame,
{
Eina_List *left, *right;
Evas_3D_Mesh_Frame *f0, *f1;
+ Evas_3D_Mesh_Data *pdmesh = eo_data_scope_get(mesh, EO_EVAS_3D_MESH_CLASS);
- left = mesh->frames;
+ left = pdmesh->frames;
right = eina_list_next(left);
while (right)
@@ -940,8 +942,12 @@ _material_color_build(E3D_Draw_Data *data, int frame,
{
f0 = (const Evas_3D_Mesh_Frame *)eina_list_data_get(l);
- if (f0->material && f0->material->attribs[attrib].enable)
- break;
+ if (f0->material)
+ {
+ Evas_3D_Material_Data *pdm = eo_data_scope_get(f0->material, EO_EVAS_3D_MATERIAL_CLASS);
+ if (pdm->attribs[attrib].enable)
+ break;
+ }
l = eina_list_prev(l);
f0 = NULL;
@@ -951,8 +957,12 @@ _material_color_build(E3D_Draw_Data *data, int frame,
{
f1 = (const Evas_3D_Mesh_Frame *)eina_list_data_get(r);
- if (f1->material && f1->material->attribs[attrib].enable)
- break;
+ if (f1->material)
+ {
+ Evas_3D_Material_Data *pdm = eo_data_scope_get(f1->material, EO_EVAS_3D_MATERIAL_CLASS);
+ if (pdm->attribs[attrib].enable)
+ break;
+ }
r = eina_list_next(r);
f1 = NULL;
@@ -978,28 +988,29 @@ _material_color_build(E3D_Draw_Data *data, int frame,
f1 = NULL;
}
}
-
+ Evas_3D_Material_Data *pdmf0 = eo_data_scope_get(f0->material, EO_EVAS_3D_MATERIAL_CLASS);
if (f1 == NULL)
{
- data->materials[attrib].color = f0->material->attribs[attrib].color;
+ data->materials[attrib].color = pdmf0->attribs[attrib].color;
if (attrib == EVAS_3D_MATERIAL_SPECULAR)
- data->shininess = f0->material->shininess;
+ data->shininess = pdmf0->shininess;
}
else
{
Evas_Real weight;
+ Evas_3D_Material_Data *pdmf1 = eo_data_scope_get(f1->material, EO_EVAS_3D_MATERIAL_CLASS);
weight = (f1->frame - frame) / (Evas_Real)(f1->frame - f0->frame);
evas_color_blend(&data->materials[attrib].color,
- &f0->material->attribs[attrib].color,
- &f1->material->attribs[attrib].color,
+ &pdmf0->attribs[attrib].color,
+ &pdmf0->attribs[attrib].color,
weight);
if (attrib == EVAS_3D_MATERIAL_SPECULAR)
{
- data->shininess = f0->material->shininess * weight +
- f1->material->shininess * (1.0 - weight);
+ data->shininess = pdmf0->shininess * weight +
+ pdmf1->shininess * (1.0 - weight);
}
}
@@ -1018,10 +1029,12 @@ _material_texture_build(E3D_Draw_Data *data, int frame,
{
f0 = (const Evas_3D_Mesh_Frame *)eina_list_data_get(l);
- if (f0->material &&
- f0->material->attribs[attrib].enable &&
- f0->material->attribs[attrib].texture != NULL)
- break;
+ if (f0->material)
+ {
+ Evas_3D_Material_Data *pdm = eo_data_scope_get(f0->material, EO_EVAS_3D_MATERIAL_CLASS);
+ if (pdm->attribs[attrib].enable && pdm->attribs[attrib].texture != NULL)
+ break;
+ }
l = eina_list_prev(l);
f0 = NULL;
@@ -1031,10 +1044,12 @@ _material_texture_build(E3D_Draw_Data *data, int frame,
{
f1 = (const Evas_3D_Mesh_Frame *)eina_list_data_get(r);
- if (f1->material &&
- f1->material->attribs[attrib].enable &&
- f1->material->attribs[attrib].texture != NULL)
- break;
+ if (f1->material)
+ {
+ Evas_3D_Material_Data *pdm = eo_data_scope_get(f1->material, EO_EVAS_3D_MATERIAL_CLASS);
+ if (pdm->attribs[attrib].enable && pdm->attribs[attrib].texture != NULL)
+ break;
+ }
r = eina_list_next(r);
f1 = NULL;
@@ -1061,24 +1076,26 @@ _material_texture_build(E3D_Draw_Data *data, int frame,
}
}
+ Evas_3D_Material_Data *pdmf0 = eo_data_scope_get(f0->material, EO_EVAS_3D_MATERIAL_CLASS);
data->materials[attrib].sampler0 = data->texture_count++;
- data->materials[attrib].tex0 =
- (E3D_Texture *)f0->material->attribs[attrib].texture->engine_data;
+ Evas_3D_Texture_Data *pd = eo_data_scope_get(pdmf0->attribs[attrib].texture, EO_EVAS_3D_TEXTURE_CLASS);
+ data->materials[attrib].tex0 = (E3D_Texture *)pd->engine_data;
if (f1)
{
+ Evas_3D_Material_Data *pdmf1 = eo_data_scope_get(f1->material, EO_EVAS_3D_MATERIAL_CLASS);
Evas_Real weight = (f1->frame - frame) / (Evas_Real)(f1->frame - f0->frame);
data->materials[attrib].sampler1 = data->texture_count++;
- data->materials[attrib].tex1 =
- (E3D_Texture *)f1->material->attribs[attrib].texture->engine_data;
+ Evas_3D_Texture_Data *pd = eo_data_scope_get(pdmf1->attribs[attrib].texture, EO_EVAS_3D_TEXTURE_CLASS);
+ data->materials[attrib].tex1 = (E3D_Texture *)pd->engine_data;
data->materials[attrib].texture_weight = weight;
if (attrib == EVAS_3D_MATERIAL_SPECULAR)
{
- data->shininess = f0->material->shininess * weight +
- f1->material->shininess * (1.0 - weight);
+ data->shininess = pdmf0->shininess * weight +
+ pdmf1->shininess * (1.0 - weight);
}
_material_texture_flag_add(data, attrib, EINA_TRUE);
@@ -1086,7 +1103,7 @@ _material_texture_build(E3D_Draw_Data *data, int frame,
else
{
if (attrib == EVAS_3D_MATERIAL_SPECULAR)
- data->shininess = f0->material->shininess;
+ data->shininess = pdmf0->shininess;
_material_texture_flag_add(data, attrib, EINA_FALSE);
}
@@ -1099,20 +1116,22 @@ _light_build(E3D_Draw_Data *data,
const Evas_3D_Node *light,
const Evas_Mat4 *matrix_eye)
{
- Evas_3D_Light *l = light->data.light.light;
+ Evas_3D_Node_Data *pd_light_node = eo_data_scope_get(light, EO_EVAS_3D_NODE_CLASS);
+ Evas_3D_Light *l = pd_light_node->data.light.light;
+ Evas_3D_Light_Data *pdl = eo_data_scope_get(l, EO_EVAS_3D_LIGHT_CLASS);
Evas_Vec3 pos, dir;
- if (l == NULL)
+ if (pdl == NULL)
return;
/* Get light node's position. */
- if (l->directional)
+ if (pdl->directional)
{
data->flags |= E3D_SHADER_FLAG_LIGHT_DIRECTIONAL;
/* Negative Z. */
evas_vec3_set(&dir, 0.0, 0.0, 1.0);
- evas_vec3_quaternion_rotate(&dir, &dir, &light->orientation);
+ evas_vec3_quaternion_rotate(&dir, &dir, &pd_light_node->orientation);
/* Transform to eye space. */
evas_vec3_homogeneous_direction_transform(&dir, &dir, matrix_eye);
@@ -1125,7 +1144,7 @@ _light_build(E3D_Draw_Data *data,
}
else
{
- evas_vec3_copy(&pos, &light->position_world);
+ evas_vec3_copy(&pos, &pd_light_node->position_world);
evas_vec3_homogeneous_position_transform(&pos, &pos, matrix_eye);
data->light.position.x = pos.x;
@@ -1133,31 +1152,31 @@ _light_build(E3D_Draw_Data *data,
data->light.position.z = pos.z;
data->light.position.w = 1.0;
- if (l->enable_attenuation)
+ if (pdl->enable_attenuation)
{
data->flags |= E3D_SHADER_FLAG_LIGHT_ATTENUATION;
- data->light.atten.x = l->atten_const;
- data->light.atten.x = l->atten_linear;
- data->light.atten.x = l->atten_quad;
+ data->light.atten.x = pdl->atten_const;
+ data->light.atten.x = pdl->atten_linear;
+ data->light.atten.x = pdl->atten_quad;
}
- if (l->spot_cutoff < 180.0)
+ if (pdl->spot_cutoff < 180.0)
{
data->flags |= E3D_SHADER_FLAG_LIGHT_SPOT;
evas_vec3_set(&dir, 0.0, 0.0, -1.0);
- evas_vec3_quaternion_rotate(&dir, &dir, &light->orientation);
+ evas_vec3_quaternion_rotate(&dir, &dir, &pd_light_node->orientation);
evas_vec3_homogeneous_direction_transform(&dir, &dir, matrix_eye);
data->light.spot_dir = dir;
- data->light.spot_exp = l->spot_exp;
- data->light.spot_cutoff_cos = l->spot_cutoff_cos;
+ data->light.spot_exp = pdl->spot_exp;
+ data->light.spot_cutoff_cos = pdl->spot_cutoff_cos;
}
}
- data->light.ambient = l->ambient;
- data->light.diffuse = l->diffuse;
- data->light.specular = l->specular;
+ data->light.ambient = pdl->ambient;
+ data->light.diffuse = pdl->diffuse;
+ data->light.specular = pdl->specular;
}
static inline Eina_Bool
@@ -1169,16 +1188,17 @@ _mesh_draw_data_build(E3D_Draw_Data *data,
const Evas_3D_Node *light)
{
Eina_List *l, *r;
+ Evas_3D_Mesh_Data *pdmesh = eo_data_scope_get(mesh, EO_EVAS_3D_MESH_CLASS);
- if (mesh->frames == NULL)
+ if (pdmesh->frames == NULL)
return EINA_FALSE;
- data->mode = mesh->shade_mode;
- data->assembly = mesh->assembly;
- data->vertex_count = mesh->vertex_count;
- data->index_count = mesh->index_count;
- data->index_format = mesh->index_format;
- data->indices = mesh->indices;
+ data->mode = pdmesh->shade_mode;
+ data->assembly = pdmesh->assembly;
+ data->vertex_count = pdmesh->vertex_count;
+ data->index_count = pdmesh->index_count;
+ data->index_format = pdmesh->index_format;
+ data->indices = pdmesh->indices;
evas_mat4_copy(&data->matrix_mvp, matrix_mvp);
evas_mat4_copy(&data->matrix_mv, matrix_mv);
@@ -1195,12 +1215,12 @@ _mesh_draw_data_build(E3D_Draw_Data *data,
} \
} while (0)
- if (mesh->shade_mode == EVAS_3D_SHADE_MODE_VERTEX_COLOR)
+ if (pdmesh->shade_mode == EVAS_3D_SHADE_MODE_VERTEX_COLOR)
{
BUILD(vertex_attrib, VERTEX_POSITION, EINA_TRUE);
BUILD(vertex_attrib, VERTEX_COLOR, EINA_TRUE);
}
- else if (mesh->shade_mode == EVAS_3D_SHADE_MODE_DIFFUSE)
+ else if (pdmesh->shade_mode == EVAS_3D_SHADE_MODE_DIFFUSE)
{
BUILD(vertex_attrib, VERTEX_POSITION, EINA_TRUE);
BUILD(material_color, MATERIAL_DIFFUSE, EINA_TRUE);
@@ -1209,7 +1229,7 @@ _mesh_draw_data_build(E3D_Draw_Data *data,
if (_flags_need_tex_coord(data->flags))
BUILD(vertex_attrib, VERTEX_TEXCOORD, EINA_FALSE);
}
- else if (mesh->shade_mode == EVAS_3D_SHADE_MODE_FLAT)
+ else if (pdmesh->shade_mode == EVAS_3D_SHADE_MODE_FLAT)
{
BUILD(vertex_attrib, VERTEX_POSITION, EINA_TRUE);
BUILD(vertex_attrib, VERTEX_NORMAL, EINA_TRUE);
@@ -1230,7 +1250,7 @@ _mesh_draw_data_build(E3D_Draw_Data *data,
if (_flags_need_tex_coord(data->flags))
BUILD(vertex_attrib, VERTEX_TEXCOORD, EINA_FALSE);
}
- else if (mesh->shade_mode == EVAS_3D_SHADE_MODE_PHONG)
+ else if (pdmesh->shade_mode == EVAS_3D_SHADE_MODE_PHONG)
{
BUILD(vertex_attrib, VERTEX_POSITION, EINA_TRUE);
BUILD(vertex_attrib, VERTEX_NORMAL, EINA_TRUE);
@@ -1251,7 +1271,7 @@ _mesh_draw_data_build(E3D_Draw_Data *data,
if (_flags_need_tex_coord(data->flags))
BUILD(vertex_attrib, VERTEX_TEXCOORD, EINA_FALSE);
}
- else if (mesh->shade_mode == EVAS_3D_SHADE_MODE_NORMAL_MAP)
+ else if (pdmesh->shade_mode == EVAS_3D_SHADE_MODE_NORMAL_MAP)
{
BUILD(vertex_attrib, VERTEX_POSITION, EINA_TRUE);
BUILD(vertex_attrib, VERTEX_NORMAL, EINA_TRUE);
@@ -1289,7 +1309,7 @@ _mesh_draw(E3D_Renderer *renderer, Evas_3D_Mesh *mesh, int frame, Evas_3D_Node *
}
void
-e3d_drawable_scene_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_3D_Scene_Data *data)
+e3d_drawable_scene_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_3D_Scene_Public_Data *data)
{
Eina_List *l;
Evas_3D_Node *n;
@@ -1301,7 +1321,10 @@ e3d_drawable_scene_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_3
e3d_renderer_clear(renderer, &data->bg_color);
/* Get eye matrix. */
- matrix_eye = &data->camera_node->data.camera.matrix_world_to_eye;
+ Evas_3D_Node_Data *pd_camera_node = eo_data_scope_get(data->camera_node, EO_EVAS_3D_NODE_CLASS);
+ matrix_eye = &pd_camera_node->data.camera.matrix_world_to_eye;
+
+ Evas_3D_Camera_Data *pd = eo_data_scope_get(pd_camera_node->data.camera.camera, EO_EVAS_3D_CAMERA_CLASS);
EINA_LIST_FOREACH(data->mesh_nodes, l, n)
{
@@ -1309,15 +1332,16 @@ e3d_drawable_scene_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_3
Evas_Mat4 matrix_mvp;
Eina_Iterator *it;
void *ptr;
-
- evas_mat4_multiply(&matrix_mv, matrix_eye, &n->data.mesh.matrix_local_to_world);
- evas_mat4_multiply(&matrix_mvp, &data->camera_node->data.camera.camera->projection,
+ Evas_3D_Node_Data *pd_mesh_node = eo_data_scope_get(n, EO_EVAS_3D_NODE_CLASS);
+ evas_mat4_multiply(&matrix_mv, matrix_eye, &pd_mesh_node->data.mesh.matrix_local_to_world);
+ evas_mat4_multiply(&matrix_mvp, matrix_eye, &matrix_mv);
+ evas_mat4_multiply(&matrix_mvp, &pd->projection,
&matrix_mv);
/* TODO: Get most effective light node. */
light = eina_list_data_get(data->light_nodes);
- it = eina_hash_iterator_data_new(n->data.mesh.node_meshes);
+ it = eina_hash_iterator_data_new(pd_mesh_node->data.mesh.node_meshes);
while (eina_iterator_next(it, &ptr))
{
diff --git a/src/modules/evas/engines/gl_common/evas_gl_3d_common.h b/src/modules/evas/engines/gl_common/evas_gl_3d_common.h
index 3f93ad5c4b..ceba63e5f0 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_3d_common.h
+++ b/src/modules/evas/engines/gl_common/evas_gl_3d_common.h
@@ -27,7 +27,7 @@ void e3d_texture_filter_get(const E3D_Texture *texture, Evas_3D_
/* Drawable */
E3D_Drawable *e3d_drawable_new(int w, int h, int alpha, GLenum depth_format, GLenum stencil_format);
void e3d_drawable_free(E3D_Drawable *drawable);
-void e3d_drawable_scene_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_3D_Scene_Data *data);
+void e3d_drawable_scene_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_3D_Scene_Public_Data *data);
void e3d_drawable_size_get(E3D_Drawable *drawable, int *w, int *h);
GLuint e3d_drawable_texture_id_get(E3D_Drawable *drawable);
GLenum e3d_drawable_format_get(E3D_Drawable *drawable);
diff --git a/src/modules/evas/engines/gl_common/evas_gl_3d_shader.c b/src/modules/evas/engines/gl_common/evas_gl_3d_shader.c
index a9f63ecbb6..c96f856958 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_3d_shader.c
+++ b/src/modules/evas/engines/gl_common/evas_gl_3d_shader.c
@@ -1251,15 +1251,27 @@ _uniform_upload(E3D_Uniform u, GLint loc, const E3D_Draw_Data *data)
{
switch (u)
{
- case E3D_UNIFORM_MATRIX_MVP:
- glUniformMatrix4fv(loc, 1, EINA_FALSE, &data->matrix_mvp.m[0]);
+ case E3D_UNIFORM_MATRIX_MVP: {
+ float m[16];
+ for(int i = 0 ; i <16 ; i++)
+ m[i] = data->matrix_mvp.m[i];
+ glUniformMatrix4fv(loc, 1, EINA_FALSE, &m[0]);
break;
- case E3D_UNIFORM_MATRIX_MV:
- glUniformMatrix4fv(loc, 1, EINA_FALSE, &data->matrix_mv.m[0]);
+ }
+ case E3D_UNIFORM_MATRIX_MV: {
+ float m[16];
+ for(int i = 0 ; i <16 ; i++)
+ m[i] = data->matrix_mv.m[i];
+ glUniformMatrix4fv(loc, 1, EINA_FALSE, &m[0]);
break;
- case E3D_UNIFORM_MATRIX_NORMAL:
- glUniformMatrix3fv(loc, 1, EINA_FALSE, &data->matrix_normal.m[0]);
+ }
+ case E3D_UNIFORM_MATRIX_NORMAL: {
+ float m[9];
+ for(int i = 0 ; i <9 ; i++)
+ m[i] = data->matrix_normal.m[i];
+ glUniformMatrix3fv(loc, 1, EINA_FALSE, &m[0]);
break;
+ }
case E3D_UNIFORM_POSITION_WEIGHT:
glUniform1f(loc, data->vertices[EVAS_3D_VERTEX_POSITION].weight);
break;