Subversion Repositories AndroidProjects

Rev

Rev 1817 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package com.gebauz.bauzoid2.graphics.model;

import com.gebauz.bauzoid2.game.Engine;
import com.gebauz.bauzoid2.game.Time;
import com.gebauz.bauzoid2.graphics.animation.Animation;
import com.gebauz.bauzoid2.graphics.util.Transform;
import com.gebauz.bauzoid2.math.Matrix4;
import com.gebauz.bauzoid2.math.Quaternion;
import com.gebauz.bauzoid2.math.Vector4;

/**
 * Created by chris on 12.12.2014.
 */

public class Model
{
    // Constants========================================================================================

    // Embedded Types===================================================================================

    // Fields===========================================================================================

    private String mName;
    private Mesh[] mMeshes = null;

    private ModelNode[] mNodes = null;
    private Material[] mMaterials = null;
        private Animation[] mAnimations = null;

    // Methods==========================================================================================

    public Model(String name)
    {
        mName = name;
    }

    public void dispose()
    {
        destroyNodes();
        destroyMeshes();
        destroyMaterials();
    }

    public void destroyMeshes()
    {
        if (mMeshes != null)
        {
            for (int i = 0; i < mMeshes.length; i++)
            {
                mMeshes[i].dispose();
                mMeshes[i] = null;
            }

            mMeshes = null;
        }
    }

    public void destroyMaterials()
    {
        if (mMaterials != null)
        {
            for (int i = 0; i < mMaterials.length; i++)
            {
                mMaterials[i].dispose();
                mMaterials[i] = null;
            }
            mMaterials = null;
        }
    }

    public void destroyNodes()
    {
        if (mNodes != null)
        {
            for (int i = 0; i < mNodes.length; i++)
            {
                mNodes[i] = null;
            }
            mNodes = null;
        }
    }

        public ModelNode findNode(String id)
        {
                for (ModelNode node : mNodes)
                {
                        if (node.getName().equalsIgnoreCase(id))
                                return node;
                }

                return null;
        }

    public void calcGlobalTransforms()
    {
        for (int i = 0; i < mNodes.length; i++)
        {
            ModelNode node = mNodes[i];

            /*com.badlogic.gdx.math.Vector3 translation = new com.badlogic.gdx.math.Vector3(
                node.transform.translation.x, node.transform.translation.y, node.transform.translation.z);
            com.badlogic.gdx.math.Quaternion rotation = new com.badlogic.gdx.math.Quaternion(
                node.transform.rotation.x, node.transform.rotation.y, node.transform.rotation.z, node.transform.rotation.w
            );
            com.badlogic.gdx.math.Vector3 scale = new com.badlogic.gdx.math.Vector3(
                node.transform.scale.x, node.transform.scale.y, node.transform.scale.z
            );

            node.localTransform.set(translation, rotation, scale);

            if (node.getParentIndex() != -1)
            {
                ModelNode parentNode = mNodes[node.getParentIndex()];
                node.globalTransform.set(parentNode.globalTransform).mul(node.localTransform);
            }
            else
            {
                node.globalTransform.set(node.localTransform);
            }*/



                        node.getGlobalTransform().copyFrom(node.transform.calcMatrix());
                        node.getGlobalBindPose().copyFrom(node.bindPose.calcMatrix());
            if (node.getParentIndex() != -1)
            {
                ModelNode parentNode = mNodes[node.getParentIndex()];
                node.getGlobalTransform().postMultiply(parentNode.getGlobalTransform());
                                node.getGlobalBindPose().postMultiply(parentNode.getGlobalBindPose());
            }
        }
    }

    public void render()
    {
                for (Animation anim : mAnimations)
                {
                        anim.setCurrentTime(Time.getRunTime() * 1000);
            anim.setCurrentTime(0);
                        anim.applyAnimation();
                }

        calcGlobalTransforms();

        for (int i = 0; i < mNodes.length; i++)
        {
            ModelNode node = mNodes[i];

            Engine.graphics.renderStates.pushModelMatrix();
            Engine.graphics.renderStates.model.postMultiply(node.getGlobalTransform());

            if (node.parts != null)
            {
                for (ModelPart part : node.parts)
                {
                                        // render bones
                                        part.getMaterial().beginRender();
                    part.getMaterial().setMatrixPalette(part.calcBoneMatrices());
                    //part.render();
                                        part.getMeshGroup().render();
                                        part.getMaterial().endRender();

                                        /*for (int j = 0; j < part.getBoneInfluences().length; j++)
                                        {
                                                ModelNode bone = part.getBoneInfluences()[j];
                                                Transform t = part.getBoneTransforms()[j];

                                                Engine.graphics.renderStates.pushModelMatrix();
                                                Engine.graphics.renderStates.model.copyFrom(bone.getGlobalTransform());
                                                //Engine.graphics.renderStates.model.preMultiply(t.calcMatrix());
                                                //Quaternion q = new Quaternion(0.5f, -0.5f, 0.5f, 0.5f);
                                                //Engine.graphics.renderStates.model.preMultiply(q.toMatrix());
                                                //Engine.graphics.renderStates.model.preMultiply(Matrix4.createScale(3));
                                                Engine.graphics.util.drawMarker(new Vector4(1, 1, 0, 1));
                                                Engine.graphics.renderStates.popModelMatrix();
                                        }*/

                }
            }
                        else
                        {
                                /*Engine.graphics.renderStates.pushModelMatrix();
                                //Quaternion q = new Quaternion(0.5f, -0.5f, 0.5f, 0.5f);
                                //Engine.graphics.renderStates.model.preMultiply(q.toMatrix());
                                //Engine.graphics.renderStates.model.preMultiply(Matrix4.createScale(3));
                                Engine.graphics.util.drawMarker(new Vector4(1, 1, 0, 1));
                                Engine.graphics.renderStates.popModelMatrix();*/

                        }

            Engine.graphics.renderStates.popModelMatrix();
        }
    }

    // Getters/Setters==================================================================================

    public final void setMeshes(Mesh[] meshes) { mMeshes = meshes; }
    public final Mesh[] getMeshes() { return mMeshes; }

    public final void setMaterials(Material[] materials) { mMaterials = materials; }
    public final Material[] getMaterials() { return mMaterials; }

    public final void setNodes(ModelNode[] nodes) { mNodes = nodes; }
    public final ModelNode[] getNodes() { return mNodes; }

        public final void setAnimations(Animation[] anims) { mAnimations = anims; }
        public final Animation[] getAnimations() { return mAnimations; }
}