evas: sphere is rotated to standard axis and fix tangents of sphere for Evas_3D examples.

Reviewers: Hermet, raster, cedric

Reviewed By: cedric

Subscribers: cedric

Differential Revision: https://phab.enlightenment.org/D2333

Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
This commit is contained in:
Bogdan Devichev 2015-04-15 17:01:40 +02:00 committed by Cedric BAIL
parent 330159d255
commit b803714e40
1 changed files with 86 additions and 24 deletions

View File

@ -278,45 +278,107 @@ void
evas_3d_add_sphere_frame(Eo *mesh, int frame, int p, vec2 tex_scale)
{
int vcount, icount, vccount, i, j;
icount = p * p * 6;
unsigned short *index;
vccount = p + 1;
vcount = vccount * vccount;
icount = p * p * 6;
ALLOCATE_VERTEX_DATA
double dtheta, dfi, sinth, costh, fi, theta, sinfi, cosfi;
dtheta = M_PI / p;
dfi = 2 * M_PI / p;
for (j = 0; j < vccount; j++)
/* Calculate vertices position of the sphere mesh by using
splitting of sphere by latitude and longitude. */
for (i = 0; i <= p; i++)
{
theta = j * dtheta;
sinth = sin(theta);
costh = cos(theta);
for (i = 0; i < vccount; i++)
double lati, z, r, point_r;
point_r = 0.00001;//non-zero little value for correct tangents calculation.
lati = ((M_PI - 2 * point_r) * (double)i) / (double)p;
z = cos(lati + point_r);
r = fabs(sin(lati + point_r));
for (j = 0; j <= p; j++)
{
fi = i * dfi;
sinfi = sin(fi);
cosfi = cos(fi);
normals[i + j * vccount].x = sinth * sinfi;
normals[i + j * vccount].y = costh;
normals[i + j * vccount].z = sinth * cosfi;
double longi;
int num = (i * (p + 1)) + j;
vertices[i + j * vccount].x = normals[i + j * vccount].x / 2;
vertices[i + j * vccount].y = normals[i + j * vccount].y / 2;
vertices[i + j * vccount].z = normals[i + j * vccount].z / 2;
longi = (M_PI * 2.0 * (double)j) / (double)p;
tangents[i + j * vccount].x = normals[i + j * vccount].z;
tangents[i + j * vccount].y = normals[i + j * vccount].y;
tangents[i + j * vccount].z = -normals[i + j * vccount].x;
normals[num].x = r * sin(longi);
normals[num].y = r * cos(longi);
normals[num].z = z;
tex_coord[i + j * vccount].x = i / (float)(vccount - 1) * tex_scale.x;
tex_coord[i + j *vccount].y = tex_scale.y - j / (float)(vccount - 1) * tex_scale.y;
vertices[num].x = normals[num].x / 2;
vertices[num].y = normals[num].y / 2;
vertices[num].z = normals[num].z / 2;
if (vertices[num].x > 0.0)
{
tangents[num].x = -normals[num].z;
tangents[num].y = normals[num].y;
tangents[num].z = normals[num].x;
}
else
{
tangents[num].x = normals[num].z;
tangents[num].y = normals[num].y;
tangents[num].z = -normals[num].x;
}
tex_coord[num].x = i / (float)(vccount - 1) * tex_scale.x;
tex_coord[num].y = tex_scale.y - j / (float)(vccount - 1) * tex_scale.y;
}
}
_generate_grid_indices(indices, p);
/* Triangulation of sphere mesh in appliance with buffer of indices. */
for (i = 0; i < icount; i += 3)
{
vec3 e1, e2;
float du1, du2, dv1, dv2, f;
vec3 tangent;
int num0, num1, num2;
num0 = indices[i + 0];
num1 = indices[i + 1];
num2 = indices[i + 2];
e1.x = vertices[num1].x - vertices[num0].x;
e1.y = vertices[num1].y - vertices[num0].y;
e1.z = vertices[num1].z - vertices[num0].z;
e2.x = vertices[num2].x - vertices[num0].x;
e2.y = vertices[num2].y - vertices[num0].y;
e2.z = vertices[num2].z - vertices[num0].z;
du1 = tex_coord[num1].x - tex_coord[num0].x;
dv1 = tex_coord[num1].y - tex_coord[num0].y;
du2 = tex_coord[num2].x - tex_coord[num0].x;
dv2 = tex_coord[num2].y - tex_coord[num0].y;
f = 1.0 / ((du1 * dv2) - (du2 * dv1));
tangent.x = f * ((dv2 * e1.x) - (dv1 * e2.x));
tangent.y = f * ((dv2 * e1.y) - (dv1 * e2.y));
tangent.z = f * ((dv2 * e1.z) - (dv1 * e2.z));
tangents[num0] = tangent;
}
/* Coupling between vertices by calculation of tangent parametr correct value. */
for (i = 0; i <= p; i++)
{
for (j = 0; j <= p; j++)
{
if (j == p)
{
tangents[(i * (p + 1)) + j] = tangents[i * (p + 1)];
}
}
}
SET_VERTEX_DATA(frame)
}