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