/******************************************************************************* * Copyright 2011 See AUTHORS file. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. ******************************************************************************/ package com.badlogic.gdx.graphics.g3d.model.still; import java.util.ArrayList; import com.badlogic.gdx.graphics.g3d.materials.Material; import com.badlogic.gdx.graphics.g3d.model.Model; import com.badlogic.gdx.graphics.g3d.model.SubMesh; import com.badlogic.gdx.graphics.glutils.ShaderProgram; import com.badlogic.gdx.math.collision.BoundingBox; public class StillModel implements Model { final public StillSubMesh[] subMeshes; public StillModel(SubMesh... subMeshes) { this.subMeshes = new StillSubMesh[subMeshes.length]; for (int i = 0; i < subMeshes.length; ++i) { this.subMeshes[i] = (StillSubMesh) subMeshes[i]; } } @Override public void render() { int len = subMeshes.length; for (int i = 0; i < len; i++) { StillSubMesh subMesh = subMeshes[i]; if (i == 0) { subMesh.material.bind(); } else if (!subMeshes[i - 1].material.equals(subMesh.material)) { subMesh.material.bind(); } subMesh.mesh.render(subMesh.primitiveType); } } @Override public void render(ShaderProgram program) { int len = subMeshes.length; for (int i = 0; i < len; i++) { StillSubMesh subMesh = subMeshes[i]; if (i == 0) { subMesh.material.bind(program); } else if (!subMeshes[i - 1].material.equals(subMesh.material)) { subMesh.material.bind(program); } subMesh.mesh.render(program, subMesh.primitiveType); } } @Override public Model getSubModel(String... subMeshNames) { ArrayList<SubMesh> subMeshes = new ArrayList<SubMesh>(); for (String name : subMeshNames) for (StillSubMesh subMesh : this.subMeshes) if (name.equals(subMesh.name)) subMeshes.add(subMesh); if (subMeshes.size() > 0) return new StillModel(subMeshes.toArray(new StillSubMesh[subMeshes.size()])); return null; } @Override public StillSubMesh getSubMesh(String name) { for (StillSubMesh subMesh : subMeshes) { if (subMesh.name.equals(name)) return subMesh; } return null; } @Override public SubMesh[] getSubMeshes() { return subMeshes; } @Override public void setMaterials(Material... materials) { if (materials.length != subMeshes.length) throw new UnsupportedOperationException("number of materials must equal number of sub-meshes"); int len = materials.length; for (int i = 0; i < len; i++) { subMeshes[i].material = materials[i]; } } @Override public void setMaterial(Material material) { int len = subMeshes.length; for (int i = 0; i < len; i++) { subMeshes[i].material = material; } } private final static BoundingBox tmpBox = new BoundingBox(); @Override public void getBoundingBox(BoundingBox bbox) { bbox.inf(); for (int i = 0; i < subMeshes.length; i++) { subMeshes[i].mesh.calculateBoundingBox(tmpBox); bbox.ext(tmpBox); } } @Override public void dispose() { for (int i = 0; i < subMeshes.length; i++) { subMeshes[i].mesh.dispose(); } } }