blob: 448cce02745d7bfee535033d1314f1fc3bc8acf9 [file] [log] [blame]
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.film;
import java.io.Writer;
import java.lang.Math;
import android.util.Log;
import android.renderscript.RenderScript;
import android.renderscript.SimpleMesh;
class FilmStripMesh {
class Vertex {
float nx;
float ny;
float nz;
float s;
float t;
float x;
float y;
float z;
Vertex() {
nx = 0;
ny = 0;
nz = 0;
s = 0;
t = 0;
x = 0;
y = 0;
z = 0;
}
void xyz(float _x, float _y, float _z) {
x = _x;
y = _y;
z = _z;
}
void nxyz(float _x, float _y, float _z) {
nx = _x;
ny = _y;
nz = _z;
}
void st(float _s, float _t) {
s = _s;
t = _t;
}
void computeNorm(Vertex v1, Vertex v2) {
float dx = v1.x - v2.x;
float dy = v1.y - v2.y;
float dz = v1.z - v2.z;
float len = (float)java.lang.Math.sqrt(dx*dx + dy*dy + dz*dz);
dx /= len;
dy /= len;
dz /= len;
nx = dx * dz;
ny = dy * dz;
nz = (float)java.lang.Math.sqrt(dx*dx + dy*dy);
len = (float)java.lang.Math.sqrt(nx*nx + ny*ny + nz*nz);
nx /= len;
ny /= len;
nz /= len;
}
}
int[] mTriangleOffsets;
float[] mTriangleOffsetsTex;
int mTriangleOffsetsCount;
SimpleMesh init(RenderScript rs)
{
float vtx[] = new float[] {
60.431003f, 124.482050f,
60.862074f, 120.872604f,
61.705303f, 117.336662f,
62.949505f, 113.921127f,
64.578177f, 110.671304f,
66.569716f, 107.630302f,
68.897703f, 104.838457f,
71.531259f, 102.332803f,
74.435452f, 100.146577f,
77.571757f, 98.308777f,
80.898574f, 96.843781f,
84.371773f, 95.771023f,
87.945283f, 95.104731f,
98.958994f, 95.267098f,
109.489523f, 98.497596f,
118.699582f, 104.539366f,
125.856872f, 112.912022f,
130.392311f, 122.949849f,
131.945283f, 133.854731f,
130.392311f, 144.759613f,
125.856872f, 154.797439f,
118.699582f, 163.170096f,
109.489523f, 169.211866f,
98.958994f, 172.442364f,
87.945283f, 172.604731f,
72.507313f, 172.672927f,
57.678920f, 168.377071f,
44.668135f, 160.067134f,
34.534908f, 148.420104f,
28.104767f, 134.384831f,
25.901557f, 119.104731f,
28.104767f, 103.824631f,
34.534908f, 89.789358f,
44.668135f, 78.142327f,
57.678920f, 69.832390f,
72.507313f, 65.536534f,
87.945283f, 65.604731f,
106.918117f, 65.688542f,
125.141795f, 60.409056f,
141.131686f, 50.196376f,
153.585137f, 35.882502f,
161.487600f, 18.633545f,
164.195283f, -0.145269f,
161.487600f, -18.924084f,
153.585137f, -36.173040f,
141.131686f, -50.486914f,
125.141795f, -60.699594f,
106.918117f, -65.979081f,
87.945283f, -65.895269f,
80f, -65.895269f,
60f, -65.895269f,
40f, -65.895269f,
20f, -65.895269f,
0f, -65.895269f,
-20f, -65.895269f,
-40f, -65.895269f,
-60f, -65.895269f,
-80f, -65.895269f,
-87.945283f, -65.895269f,
-106.918117f, -65.979081f,
-125.141795f, -60.699594f,
-141.131686f, -50.486914f,
-153.585137f, -36.173040f,
-161.487600f, -18.924084f,
-164.195283f, -0.145269f,
-161.487600f, 18.633545f,
-153.585137f, 35.882502f,
-141.131686f, 50.196376f,
-125.141795f, 60.409056f,
-106.918117f, 65.688542f,
-87.945283f, 65.604731f,
-72.507313f, 65.536534f,
-57.678920f, 69.832390f,
-44.668135f, 78.142327f,
-34.534908f, 89.789358f,
-28.104767f, 103.824631f,
-25.901557f, 119.104731f,
-28.104767f, 134.384831f,
-34.534908f, 148.420104f,
-44.668135f, 160.067134f,
-57.678920f, 168.377071f,
-72.507313f, 172.672927f,
-87.945283f, 172.604731f,
-98.958994f, 172.442364f,
-109.489523f, 169.211866f,
-118.699582f, 163.170096f,
-125.856872f, 154.797439f,
-130.392311f, 144.759613f,
-131.945283f, 133.854731f,
-130.392311f, 122.949849f,
-125.856872f, 112.912022f,
-118.699582f, 104.539366f,
-109.489523f, 98.497596f,
-98.958994f, 95.267098f,
-87.945283f, 95.104731f,
-84.371773f, 95.771023f,
-80.898574f, 96.843781f,
-77.571757f, 98.308777f,
-74.435452f, 100.146577f,
-71.531259f, 102.332803f,
-68.897703f, 104.838457f,
-66.569716f, 107.630302f,
-64.578177f, 110.671304f,
-62.949505f, 113.921127f,
-61.705303f, 117.336662f,
-60.862074f, 120.872604f,
-60.431003f, 124.482050f
};
mTriangleOffsets = new int[64];
mTriangleOffsetsTex = new float[64];
mTriangleOffsets[0] = 0;
mTriangleOffsetsCount = 1;
Vertex t = new Vertex();
t.nxyz(1, 0, 0);
int count = vtx.length / 2;
SimpleMesh.TriangleMeshBuilder tm = new SimpleMesh.TriangleMeshBuilder(
rs, 3,
SimpleMesh.TriangleMeshBuilder.NORMAL | SimpleMesh.TriangleMeshBuilder.TEXTURE_0);
float runningS = 0;
for (int ct=0; ct < (count-1); ct++) {
t.x = -vtx[ct*2] / 100.f;
t.z = vtx[ct*2+1] / 100.f;
t.s = runningS;
t.nx = (vtx[ct*2+3] - vtx[ct*2 +1]);
t.ny = (vtx[ct*2+2] - vtx[ct*2 ]);
float len = (float)java.lang.Math.sqrt(t.nx * t.nx + t.ny * t.ny);
runningS += len / 100;
t.nx /= len;
t.ny /= len;
t.y = -0.5f;
t.t = 0;
tm.setNormal(t.nx, t.ny, t.nz);
tm.setTexture(t.s, t.t);
tm.addVertex(t.x, t.y, t.z);
//android.util.Log.e("rs", "vtx x="+t.x+" y="+t.y+" z="+t.z+" s="+t.s+" t="+t.t);
t.y = .5f;
t.t = 1;
tm.setTexture(t.s, t.t);
tm.addVertex(t.x, t.y, t.z);
//android.util.Log.e("rs", "vtx x="+t.x+" y="+t.y+" z="+t.z+" s="+t.s+" t="+t.t);
if((runningS*2) > mTriangleOffsetsCount) {
mTriangleOffsets[mTriangleOffsetsCount] = ct*2 * 3;
mTriangleOffsetsTex[mTriangleOffsetsCount] = t.s;
mTriangleOffsetsCount ++;
}
}
count = (count * 2 - 2);
for (int ct=0; ct < (count-2); ct+= 2) {
tm.addTriangle(ct, ct+1, ct+2);
tm.addTriangle(ct+1, ct+3, ct+2);
}
return tm.create();
}
}