Home | History | Annotate | Download | only in film
      1 /*
      2  * Copyright (C) 2009 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 
     18 package com.android.film;
     19 
     20 import java.io.Writer;
     21 import java.lang.Math;
     22 import android.util.Log;
     23 
     24 import android.renderscript.RenderScript;
     25 import android.renderscript.SimpleMesh;
     26 
     27 
     28 class FilmStripMesh {
     29 
     30     class Vertex {
     31         float nx;
     32         float ny;
     33         float nz;
     34         float s;
     35         float t;
     36         float x;
     37         float y;
     38         float z;
     39 
     40         Vertex() {
     41             nx = 0;
     42             ny = 0;
     43             nz = 0;
     44             s = 0;
     45             t = 0;
     46             x = 0;
     47             y = 0;
     48             z = 0;
     49         }
     50 
     51         void xyz(float _x, float _y, float _z) {
     52             x = _x;
     53             y = _y;
     54             z = _z;
     55         }
     56 
     57         void nxyz(float _x, float _y, float _z) {
     58             nx = _x;
     59             ny = _y;
     60             nz = _z;
     61         }
     62 
     63         void st(float _s, float _t) {
     64             s = _s;
     65             t = _t;
     66         }
     67 
     68         void computeNorm(Vertex v1, Vertex v2) {
     69             float dx = v1.x - v2.x;
     70             float dy = v1.y - v2.y;
     71             float dz = v1.z - v2.z;
     72             float len = (float)java.lang.Math.sqrt(dx*dx + dy*dy + dz*dz);
     73             dx /= len;
     74             dy /= len;
     75             dz /= len;
     76 
     77             nx = dx * dz;
     78             ny = dy * dz;
     79             nz = (float)java.lang.Math.sqrt(dx*dx + dy*dy);
     80 
     81             len = (float)java.lang.Math.sqrt(nx*nx + ny*ny + nz*nz);
     82             nx /= len;
     83             ny /= len;
     84             nz /= len;
     85         }
     86     }
     87 
     88     int[] mTriangleOffsets;
     89     float[] mTriangleOffsetsTex;
     90     int mTriangleOffsetsCount;
     91 
     92     SimpleMesh init(RenderScript rs)
     93     {
     94         float vtx[] = new float[] {
     95             60.431003f, 124.482050f,
     96             60.862074f, 120.872604f,
     97             61.705303f, 117.336662f,
     98             62.949505f, 113.921127f,
     99             64.578177f, 110.671304f,
    100             66.569716f, 107.630302f,
    101             68.897703f, 104.838457f,
    102             71.531259f, 102.332803f,
    103             74.435452f, 100.146577f,
    104             77.571757f, 98.308777f,
    105             80.898574f, 96.843781f,
    106             84.371773f, 95.771023f,
    107             87.945283f, 95.104731f,
    108             98.958994f, 95.267098f,
    109             109.489523f, 98.497596f,
    110             118.699582f, 104.539366f,
    111             125.856872f, 112.912022f,
    112             130.392311f, 122.949849f,
    113             131.945283f, 133.854731f,
    114             130.392311f, 144.759613f,
    115             125.856872f, 154.797439f,
    116             118.699582f, 163.170096f,
    117             109.489523f, 169.211866f,
    118             98.958994f, 172.442364f,
    119             87.945283f, 172.604731f,
    120             72.507313f, 172.672927f,
    121             57.678920f, 168.377071f,
    122             44.668135f, 160.067134f,
    123             34.534908f, 148.420104f,
    124             28.104767f, 134.384831f,
    125             25.901557f, 119.104731f,
    126             28.104767f, 103.824631f,
    127             34.534908f, 89.789358f,
    128             44.668135f, 78.142327f,
    129             57.678920f, 69.832390f,
    130             72.507313f, 65.536534f,
    131             87.945283f, 65.604731f,
    132             106.918117f, 65.688542f,
    133             125.141795f, 60.409056f,
    134             141.131686f, 50.196376f,
    135             153.585137f, 35.882502f,
    136             161.487600f, 18.633545f,
    137             164.195283f, -0.145269f,
    138             161.487600f, -18.924084f,
    139             153.585137f, -36.173040f,
    140             141.131686f, -50.486914f,
    141             125.141795f, -60.699594f,
    142             106.918117f, -65.979081f,
    143             87.945283f, -65.895269f,
    144             80f, -65.895269f,
    145             60f, -65.895269f,
    146             40f, -65.895269f,
    147             20f, -65.895269f,
    148             0f, -65.895269f,
    149             -20f, -65.895269f,
    150             -40f, -65.895269f,
    151             -60f, -65.895269f,
    152             -80f, -65.895269f,
    153             -87.945283f, -65.895269f,
    154             -106.918117f, -65.979081f,
    155             -125.141795f, -60.699594f,
    156             -141.131686f, -50.486914f,
    157             -153.585137f, -36.173040f,
    158             -161.487600f, -18.924084f,
    159             -164.195283f, -0.145269f,
    160             -161.487600f, 18.633545f,
    161              -153.585137f, 35.882502f,
    162              -141.131686f, 50.196376f,
    163              -125.141795f, 60.409056f,
    164              -106.918117f, 65.688542f,
    165              -87.945283f, 65.604731f,
    166              -72.507313f, 65.536534f,
    167              -57.678920f, 69.832390f,
    168              -44.668135f, 78.142327f,
    169              -34.534908f, 89.789358f,
    170              -28.104767f, 103.824631f,
    171              -25.901557f, 119.104731f,
    172              -28.104767f, 134.384831f,
    173              -34.534908f, 148.420104f,
    174              -44.668135f, 160.067134f,
    175              -57.678920f, 168.377071f,
    176              -72.507313f, 172.672927f,
    177              -87.945283f, 172.604731f,
    178              -98.958994f, 172.442364f,
    179              -109.489523f, 169.211866f,
    180              -118.699582f, 163.170096f,
    181              -125.856872f, 154.797439f,
    182              -130.392311f, 144.759613f,
    183              -131.945283f, 133.854731f,
    184              -130.392311f, 122.949849f,
    185              -125.856872f, 112.912022f,
    186              -118.699582f, 104.539366f,
    187              -109.489523f, 98.497596f,
    188              -98.958994f, 95.267098f,
    189              -87.945283f, 95.104731f,
    190              -84.371773f, 95.771023f,
    191              -80.898574f, 96.843781f,
    192              -77.571757f, 98.308777f,
    193              -74.435452f, 100.146577f,
    194              -71.531259f, 102.332803f,
    195              -68.897703f, 104.838457f,
    196              -66.569716f, 107.630302f,
    197              -64.578177f, 110.671304f,
    198              -62.949505f, 113.921127f,
    199              -61.705303f, 117.336662f,
    200              -60.862074f, 120.872604f,
    201              -60.431003f, 124.482050f
    202         };
    203 
    204 
    205         mTriangleOffsets = new int[64];
    206         mTriangleOffsetsTex = new float[64];
    207 
    208         mTriangleOffsets[0] = 0;
    209         mTriangleOffsetsCount = 1;
    210 
    211         Vertex t = new Vertex();
    212         t.nxyz(1, 0, 0);
    213         int count = vtx.length / 2;
    214 
    215         SimpleMesh.TriangleMeshBuilder tm = new SimpleMesh.TriangleMeshBuilder(
    216             rs, 3,
    217             SimpleMesh.TriangleMeshBuilder.NORMAL | SimpleMesh.TriangleMeshBuilder.TEXTURE_0);
    218 
    219         float runningS = 0;
    220         for (int ct=0; ct < (count-1); ct++) {
    221             t.x = -vtx[ct*2] / 100.f;
    222             t.z = vtx[ct*2+1] / 100.f;
    223             t.s = runningS;
    224             t.nx =  (vtx[ct*2+3] - vtx[ct*2 +1]);
    225             t.ny =  (vtx[ct*2+2] - vtx[ct*2   ]);
    226             float len = (float)java.lang.Math.sqrt(t.nx * t.nx + t.ny * t.ny);
    227             runningS += len / 100;
    228             t.nx /= len;
    229             t.ny /= len;
    230             t.y = -0.5f;
    231             t.t = 0;
    232             tm.setNormal(t.nx, t.ny, t.nz);
    233             tm.setTexture(t.s, t.t);
    234             tm.addVertex(t.x, t.y, t.z);
    235             //android.util.Log.e("rs", "vtx x="+t.x+" y="+t.y+" z="+t.z+" s="+t.s+" t="+t.t);
    236             t.y = .5f;
    237             t.t = 1;
    238             tm.setTexture(t.s, t.t);
    239             tm.addVertex(t.x, t.y, t.z);
    240             //android.util.Log.e("rs", "vtx x="+t.x+" y="+t.y+" z="+t.z+" s="+t.s+" t="+t.t);
    241 
    242             if((runningS*2) > mTriangleOffsetsCount) {
    243                 mTriangleOffsets[mTriangleOffsetsCount] = ct*2 * 3;
    244                 mTriangleOffsetsTex[mTriangleOffsetsCount] = t.s;
    245                 mTriangleOffsetsCount ++;
    246             }
    247         }
    248 
    249         count = (count * 2 - 2);
    250         for (int ct=0; ct < (count-2); ct+= 2) {
    251             tm.addTriangle(ct, ct+1, ct+2);
    252             tm.addTriangle(ct+1, ct+3, ct+2);
    253         }
    254         return tm.create();
    255     }
    256 
    257 
    258 }
    259 
    260