1a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/*
2a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project
3a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *
4a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
5a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * you may not use this file except in compliance with the License.
6a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * You may obtain a copy of the License at
7a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *
8a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
9a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *
10a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
11a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
12a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * See the License for the specific language governing permissions and
14a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * limitations under the License.
15a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk */
16a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
17a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpackage com.android.scenegraph;
18a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport com.android.scenegraph.CompoundTransform.TranslateComponent;
19a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport com.android.scenegraph.CompoundTransform.RotateComponent;
20a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport com.android.scenegraph.CompoundTransform.ScaleComponent;
21a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.io.IOException;
22a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.io.InputStream;
23a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.ArrayList;
24a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.Iterator;
25a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.List;
26a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.StringTokenizer;
27a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.HashMap;
28a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
29a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport javax.xml.parsers.DocumentBuilder;
30a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport javax.xml.parsers.DocumentBuilderFactory;
31a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport javax.xml.parsers.ParserConfigurationException;
32a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
33a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport org.w3c.dom.Document;
34a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport org.w3c.dom.Element;
35a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport org.w3c.dom.Node;
36a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport org.w3c.dom.NodeList;
37a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport org.xml.sax.SAXException;
38a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
39a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.*;
40a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.util.Log;
41a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
42a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpublic class ColladaParser {
43a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    static final String TAG = "ColladaParser";
44a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Document mDom;
45a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
46a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    HashMap<String, LightBase> mLights;
47a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    HashMap<String, Camera> mCameras;
48a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    HashMap<String, ArrayList<ShaderParam> > mEffectsParams;
49a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    HashMap<String, Texture2D> mImages;
50a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    HashMap<String, Texture2D> mSamplerImageMap;
51875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk    HashMap<String, String> mMeshIdNameMap;
52a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Scene mScene;
53a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
541168868e766f0696c30f644292a5a833ee3983e4Alex Sakhartchouk    String mRootDir;
551168868e766f0696c30f644292a5a833ee3983e4Alex Sakhartchouk
56a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    String toString(Float3 v) {
57a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String valueStr = v.x + " " + v.y + " " + v.z;
58a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return valueStr;
59a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
60a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
61a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    String toString(Float4 v) {
62a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String valueStr = v.x + " " + v.y + " " + v.z + " " + v.w;
63a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return valueStr;
64a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
65a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
66a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public ColladaParser(){
67a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLights = new HashMap<String, LightBase>();
68a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCameras = new HashMap<String, Camera>();
69a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mEffectsParams = new HashMap<String, ArrayList<ShaderParam> >();
70a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mImages = new HashMap<String, Texture2D>();
71875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        mMeshIdNameMap = new HashMap<String, String>();
72a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
73a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
741168868e766f0696c30f644292a5a833ee3983e4Alex Sakhartchouk    public void init(InputStream is, String rootDir) {
75a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLights.clear();
76a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCameras.clear();
77a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mEffectsParams.clear();
78a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
791168868e766f0696c30f644292a5a833ee3983e4Alex Sakhartchouk        mRootDir = rootDir;
801168868e766f0696c30f644292a5a833ee3983e4Alex Sakhartchouk
81a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        long start = System.currentTimeMillis();
82a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
83a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        try {
84a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            DocumentBuilder db = dbf.newDocumentBuilder();
85a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mDom = db.parse(is);
86a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        } catch(ParserConfigurationException e) {
87a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            e.printStackTrace();
88a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        } catch(SAXException e) {
89a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            e.printStackTrace();
90a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        } catch(IOException e) {
91a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            e.printStackTrace();
92a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
93a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        long end = System.currentTimeMillis();
94a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Log.v("TIMER", "    Parse time: " + (end - start));
95a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        exportSceneData();
96a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
97a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
98a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Scene getScene() {
99a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mScene;
100a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
101a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
102a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private void exportSceneData(){
103a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mScene = new Scene();
104a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
105a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Element docEle = mDom.getDocumentElement();
106a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        NodeList nl = docEle.getElementsByTagName("light");
107a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (nl != null) {
108a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            for(int i = 0; i < nl.getLength(); i++) {
109a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                Element l = (Element)nl.item(i);
110a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                convertLight(l);
111a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
112a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
113a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
114a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        nl = docEle.getElementsByTagName("camera");
115a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (nl != null) {
116a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            for(int i = 0; i < nl.getLength(); i++) {
117a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                Element c = (Element)nl.item(i);
118a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                convertCamera(c);
119a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
120a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
121a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
122a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        nl = docEle.getElementsByTagName("image");
123a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (nl != null) {
124a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            for(int i = 0; i < nl.getLength(); i++) {
125a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                Element img = (Element)nl.item(i);
126a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                convertImage(img);
127a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
128a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
129a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
130a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        nl = docEle.getElementsByTagName("effect");
131a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (nl != null) {
132a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            for(int i = 0; i < nl.getLength(); i++) {
133a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                Element e = (Element)nl.item(i);
134a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                convertEffects(e);
135a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
136a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
137a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
138a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        // Material is just a link to the effect
139a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        nl = docEle.getElementsByTagName("material");
140a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (nl != null) {
141a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            for(int i = 0; i < nl.getLength(); i++) {
142a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                Element m = (Element)nl.item(i);
143a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                convertMaterials(m);
144a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
145a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
146a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
147875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        // Look through the geometry list and build up a correlation between id's and names
148875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        nl = docEle.getElementsByTagName("geometry");
149875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        if (nl != null) {
150875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            for(int i = 0; i < nl.getLength(); i++) {
151875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                Element m = (Element)nl.item(i);
152875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                convertGeometries(m);
153875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            }
154875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        }
155875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk
156875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk
157a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        nl = docEle.getElementsByTagName("visual_scene");
158a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (nl != null) {
159a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            for(int i = 0; i < nl.getLength(); i++) {
160a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                Element s = (Element)nl.item(i);
161a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                getScene(s);
162a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
163a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
164a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
165a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
166684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    private void getRenderable(Element shape, Transform t) {
167875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        String geoURL = shape.getAttribute("url").substring(1);
168875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        String geoName = mMeshIdNameMap.get(geoURL);
169875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        if (geoName != null) {
170875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            geoURL = geoName;
171875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        }
172684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        //RenderableGroup group = new RenderableGroup();
173a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        //group.setName(geoURL.substring(1));
174684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        //mScene.appendRenderable(group);
175a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        NodeList nl = shape.getElementsByTagName("instance_material");
176a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (nl != null) {
177a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            for(int i = 0; i < nl.getLength(); i++) {
178a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                Element materialRef = (Element)nl.item(i);
179a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                String meshIndexName = materialRef.getAttribute("symbol");
180a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                String materialName = materialRef.getAttribute("target");
181a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
182684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk                Renderable d = new Renderable();
183875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                d.setMesh(geoURL, meshIndexName);
184a18d676edefbafc0b745ab98edab8f50b1c81c61Alex Sakhartchouk                d.setMaterialName(materialName.substring(1));
185875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                d.setName(geoURL);
186a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
187a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                //Log.v(TAG, "Created drawable geo " + geoURL + " index " + meshIndexName + " material " + materialName);
188a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
189a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                d.setTransform(t);
190a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                //Log.v(TAG, "Set source param " + t.getName());
191a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
192a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                // Now find all the parameters that exist on the material
193a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                ArrayList<ShaderParam> materialParams;
194a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                materialParams = mEffectsParams.get(materialName.substring(1));
195a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                for (int pI = 0; pI < materialParams.size(); pI ++) {
196a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    d.appendSourceParams(materialParams.get(pI));
197a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    //Log.v(TAG, "Set source param i: " + pI + " name " + materialParams.get(pI).getParamName());
198a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                }
199684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk                mScene.appendRenderable(d);
200a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                //group.appendChildren(d);
201a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
202a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
203a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
204a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
205a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private void updateLight(Element shape, Transform t) {
206a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String lightURL = shape.getAttribute("url");
207a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        // collada uses a uri structure to link things,
208a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        // but we ignore it for now and do a simple search
209a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        LightBase light = mLights.get(lightURL.substring(1));
210a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (light != null) {
211a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            light.setTransform(t);
212a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            //Log.v(TAG, "Set Light " + light.getName() + " " + t.getName());
213a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
214a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
215a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
216a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private void updateCamera(Element shape, Transform t) {
217a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String camURL = shape.getAttribute("url");
218a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        // collada uses a uri structure to link things,
219a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        // but we ignore it for now and do a simple search
220a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Camera cam = mCameras.get(camURL.substring(1));
221a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (cam != null) {
222a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            cam.setTransform(t);
223a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            //Log.v(TAG, "Set Camera " + cam.getName() + " " + t.getName());
224a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
225a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
226a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
227a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private void getNode(Element node, Transform parent, String indent) {
228a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String name = node.getAttribute("name");
229a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String id = node.getAttribute("id");
230a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        CompoundTransform current = new CompoundTransform();
231a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        current.setName(name);
232a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (parent != null) {
233a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            parent.appendChild(current);
234a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        } else {
235a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mScene.appendTransform(current);
236a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
237a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
238a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mScene.addToTransformMap(current);
239a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
240a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        //Log.v(TAG, indent + "|");
241a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        //Log.v(TAG, indent + "[" + name + "]");
242a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
243a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Node childNode = node.getFirstChild();
244a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        while (childNode != null) {
245a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            if (childNode.getNodeType() == Node.ELEMENT_NODE) {
246a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                Element field = (Element)childNode;
247a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                String fieldName = field.getTagName();
248a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                String description = field.getAttribute("sid");
249a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                if (fieldName.equals("translate")) {
250a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    Float3 value = getFloat3(field);
25157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk                    current.addTranslate(description, value);
252a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    //Log.v(TAG, indent + " translate " + description + toString(value));
253a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                } else if (fieldName.equals("rotate")) {
254a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    Float4 value = getFloat4(field);
255a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    //Log.v(TAG, indent + " rotate " + description + toString(value));
256a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    Float3 axis = new Float3(value.x, value.y, value.z);
25757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk                    current.addRotate(description, axis, value.w);
258a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                } else if (fieldName.equals("scale")) {
259a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    Float3 value = getFloat3(field);
260a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    //Log.v(TAG, indent + " scale " + description + toString(value));
26157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk                    current.addScale(description, value);
262a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                } else if (fieldName.equals("instance_geometry")) {
263684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk                    getRenderable(field, current);
264a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                } else if (fieldName.equals("instance_light")) {
265a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    updateLight(field, current);
266a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                } else if (fieldName.equals("instance_camera")) {
267a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    updateCamera(field, current);
268a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                } else if (fieldName.equals("node")) {
269a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    getNode(field, current, indent + "   ");
270a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                }
271a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
272a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            childNode = childNode.getNextSibling();
273a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
274a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
275a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
276875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk    // This will find the actual texture node, which is sometimes hidden behind a sampler
277875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk    // and sometimes referenced directly
278a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Texture2D getTexture(String samplerName) {
279875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        String texName = samplerName;
280a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
281875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        // Check to see if the image file is hidden by a sampler surface link combo
282875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        Element sampler = mDom.getElementById(samplerName);
283875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        if (sampler != null) {
284875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            NodeList nl = sampler.getElementsByTagName("source");
285a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            if (nl != null && nl.getLength() == 1) {
286875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                Element ref = (Element)nl.item(0);
287875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                String surfaceName = getString(ref);
288875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                if (surfaceName == null) {
289875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                    return null;
290875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                }
291875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk
292875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                Element surface = mDom.getElementById(surfaceName);
293875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                if (surface == null) {
294875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                    return null;
295875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                }
296875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                nl = surface.getElementsByTagName("init_from");
297875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                if (nl != null && nl.getLength() == 1) {
298875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                    ref = (Element)nl.item(0);
299875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                    texName = getString(ref);
300875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                }
301a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
302a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
303875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk
304875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        //Log.v(TAG, "Extracted texture name " + texName);
305875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        return mImages.get(texName);
306a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
307a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
308a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    void extractParams(Element fx, ArrayList<ShaderParam> params) {
309a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Node paramNode = fx.getFirstChild();
310a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        while (paramNode != null) {
311a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            if (paramNode.getNodeType() == Node.ELEMENT_NODE) {
312a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                String name = paramNode.getNodeName();
313a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                // Now find what type it is
314a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                Node typeNode = paramNode.getFirstChild();
315a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                while (typeNode != null && typeNode.getNodeType() != Node.ELEMENT_NODE) {
316a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    typeNode = typeNode.getNextSibling();
317a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                }
318a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                String paramType = typeNode.getNodeName();
319a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                Element typeElem = (Element)typeNode;
320a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                ShaderParam sceneParam = null;
321a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                if (paramType.equals("color")) {
322a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    Float4Param f4p = new Float4Param(name);
323a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    Float4 value = getFloat4(typeElem);
324a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    f4p.setValue(value);
325a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    sceneParam = f4p;
326a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    //Log.v(TAG, "Extracted " + sceneParam.getParamName() + " value " + toString(value));
327a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                } else if (paramType.equals("float")) {
328a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    Float4Param f4p = new Float4Param(name);
329a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    float value = getFloat(typeElem);
330a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    f4p.setValue(new Float4(value, value, value, value));
331a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    sceneParam = f4p;
332a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    //Log.v(TAG, "Extracted " + sceneParam.getParamName() + " value " + value);
333a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                }  else if (paramType.equals("texture")) {
334a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    String samplerName = typeElem.getAttribute("texture");
335a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    Texture2D tex = getTexture(samplerName);
336a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    TextureParam texP = new TextureParam(name);
337a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    texP.setTexture(tex);
338a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    sceneParam = texP;
339a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    //Log.v(TAG, "Extracted texture " + tex);
340a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                }
341a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                if (sceneParam != null) {
342a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    params.add(sceneParam);
343a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                }
344a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
345a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            paramNode = paramNode.getNextSibling();
346a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
347a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
348a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
349a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private void convertMaterials(Element mat) {
350a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String id = mat.getAttribute("id");
351a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        NodeList nl = mat.getElementsByTagName("instance_effect");
352a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (nl != null && nl.getLength() == 1) {
353a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            Element ref = (Element)nl.item(0);
354a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            String url = ref.getAttribute("url");
355a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            ArrayList<ShaderParam> params = mEffectsParams.get(url.substring(1));
356a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mEffectsParams.put(id, params);
357a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
358a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
359a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
360875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk    private void convertGeometries(Element geo) {
361875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        String id = geo.getAttribute("id");
362875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        String name = geo.getAttribute("name");
363875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        if (!id.equals(name)) {
364875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            mMeshIdNameMap.put(id, name);
365875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        }
366875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk    }
367875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk
368a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private void convertEffects(Element fx) {
369a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String id = fx.getAttribute("id");
370a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ArrayList<ShaderParam> params = new ArrayList<ShaderParam>();
371a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
372a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        NodeList nl = fx.getElementsByTagName("newparam");
373a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (nl != null) {
374a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            for(int i = 0; i < nl.getLength(); i++) {
375a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                Element field = (Element)nl.item(i);
376a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                field.setIdAttribute("sid", true);
377a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
378a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
379a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
380a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        nl = fx.getElementsByTagName("blinn");
381a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (nl != null) {
382a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            for(int i = 0; i < nl.getLength(); i++) {
383a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                Element field = (Element)nl.item(i);
384a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                //Log.v(TAG, "blinn");
385a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                extractParams(field, params);
386a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
387a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
388a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        nl = fx.getElementsByTagName("lambert");
389a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (nl != null) {
390a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            for(int i = 0; i < nl.getLength(); i++) {
391a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                Element field = (Element)nl.item(i);
392a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                //Log.v(TAG, "lambert");
393a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                extractParams(field, params);
394a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
395a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
396a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        nl = fx.getElementsByTagName("phong");
397a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (nl != null) {
398a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            for(int i = 0; i < nl.getLength(); i++) {
399a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                Element field = (Element)nl.item(i);
400a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                //Log.v(TAG, "phong");
401a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                extractParams(field, params);
402a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
403a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
404a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mEffectsParams.put(id, params);
405a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
406a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
407a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private void convertLight(Element light) {
408a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String name = light.getAttribute("name");
409a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String id = light.getAttribute("id");
410a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
411a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        // Determine type
412a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String[] knownTypes = { "point", "spot", "directional" };
413a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        final int POINT_LIGHT = 0;
414a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        final int SPOT_LIGHT = 1;
415a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        final int DIR_LIGHT = 2;
416a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        int type = -1;
417a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        for (int i = 0; i < knownTypes.length; i ++) {
418a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            NodeList nl = light.getElementsByTagName(knownTypes[i]);
419a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            if (nl != null && nl.getLength() != 0) {
420a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                type = i;
421a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                break;
422a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
423a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
424a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
425a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        //Log.v(TAG, "Found Light Type " + type);
426a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
427a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        LightBase sceneLight = null;
428a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        switch (type) {
429a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        case POINT_LIGHT:
430a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            sceneLight = new PointLight();
431a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            break;
432a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        case SPOT_LIGHT: // TODO: finish light types
433a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            break;
434a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        case DIR_LIGHT: // TODO: finish light types
435a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            break;
436a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
437a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
438a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (sceneLight == null) {
439a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            return;
440a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
441a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
442a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Float3 color = getFloat3(light, "color");
443875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        sceneLight.setColor(color.x, color.y, color.z);
444a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneLight.setName(name);
445a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mScene.appendLight(sceneLight);
446a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLights.put(id, sceneLight);
447a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
448a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        //Log.v(TAG, "Light " + name + " color " + toString(color));
449a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
450a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
451a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private void convertCamera(Element camera) {
452a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String name = camera.getAttribute("name");
453a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String id = camera.getAttribute("id");
454875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        float fov = 30.0f;
455875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        if (getString(camera, "yfov") != null) {
456875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            fov = getFloat(camera, "yfov");
457875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        } else if(getString(camera, "xfov") != null) {
458875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            float aspect = getFloat(camera, "aspect_ratio");
459875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            fov = getFloat(camera, "xfov") / aspect;
460875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        }
461875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk
462a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        float near = getFloat(camera, "znear");
463a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        float far = getFloat(camera, "zfar");
464a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
465a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Camera sceneCamera = new Camera();
466a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneCamera.setFOV(fov);
467a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneCamera.setNear(near);
468a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneCamera.setFar(far);
469a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneCamera.setName(name);
470a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mScene.appendCamera(sceneCamera);
471a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCameras.put(id, sceneCamera);
472a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
473a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
474a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private void convertImage(Element img) {
475a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String name = img.getAttribute("name");
476a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String id = img.getAttribute("id");
477a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String file = getString(img, "init_from");
478a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
479a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Texture2D tex = new Texture2D();
480a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tex.setFileName(file);
4811168868e766f0696c30f644292a5a833ee3983e4Alex Sakhartchouk        tex.setFileDir(mRootDir);
482a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mScene.appendTextures(tex);
483a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mImages.put(id, tex);
484a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
485a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
486a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private void getScene(Element scene) {
487a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String name = scene.getAttribute("name");
488a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String id = scene.getAttribute("id");
489a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
490a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Node childNode = scene.getFirstChild();
491a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        while (childNode != null) {
492a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            if (childNode.getNodeType() == Node.ELEMENT_NODE) {
493a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                String indent = "";
494a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                getNode((Element)childNode, null, indent);
495a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
496a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            childNode = childNode.getNextSibling();
497a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
498a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
499a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
500a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private String getString(Element elem, String name) {
501a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String text = null;
502a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        NodeList nl = elem.getElementsByTagName(name);
503875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        if (nl != null && nl.getLength() != 0) {
504a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            text = ((Element)nl.item(0)).getFirstChild().getNodeValue();
505a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
506a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return text;
507a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
508a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
509a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private String getString(Element elem) {
510a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String text = null;
511a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        text = elem.getFirstChild().getNodeValue();
512a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return text;
513a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
514a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
515a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private int getInt(Element elem, String name) {
516a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return Integer.parseInt(getString(elem, name));
517a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
518a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
519a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private float getFloat(Element elem, String name) {
520a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return Float.parseFloat(getString(elem, name));
521a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
522a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
523a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private float getFloat(Element elem) {
524a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return Float.parseFloat(getString(elem));
525a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
526a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
527a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private Float3 parseFloat3(String valueString) {
528a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        StringTokenizer st = new StringTokenizer(valueString);
529a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        float x = Float.parseFloat(st.nextToken());
530a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        float y = Float.parseFloat(st.nextToken());
531a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        float z = Float.parseFloat(st.nextToken());
532a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return new Float3(x, y, z);
533a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
534a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
535a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private Float4 parseFloat4(String valueString) {
536a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        StringTokenizer st = new StringTokenizer(valueString);
537a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        float x = Float.parseFloat(st.nextToken());
538a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        float y = Float.parseFloat(st.nextToken());
539a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        float z = Float.parseFloat(st.nextToken());
540a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        float w = Float.parseFloat(st.nextToken());
541a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return new Float4(x, y, z, w);
542a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
543a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
544a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private Float3 getFloat3(Element elem, String name) {
545a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String valueString = getString(elem, name);
546a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return parseFloat3(valueString);
547a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
548a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
549a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private Float4 getFloat4(Element elem, String name) {
550a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String valueString = getString(elem, name);
551a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return parseFloat4(valueString);
552a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
553a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
554a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private Float3 getFloat3(Element elem) {
555a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String valueString = getString(elem);
556a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return parseFloat3(valueString);
557a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
558a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
559a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private Float4 getFloat4(Element elem) {
560a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String valueString = getString(elem);
561a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return parseFloat4(valueString);
562a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
563a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk}
564