Subversion Repositories AndroidProjects

Rev

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

Rev Author Line No. Line
1719 chris 1
package com.gebauz.bauzoid2.graphics.model;
2
 
1752 chris 3
import com.gebauz.bauzoid2.game.Engine;
1774 chris 4
import com.gebauz.bauzoid2.game.Time;
1773 chris 5
import com.gebauz.bauzoid2.graphics.animation.Animation;
1809 chris 6
import com.gebauz.bauzoid2.graphics.util.Transform;
1776 chris 7
import com.gebauz.bauzoid2.math.Matrix4;
8
import com.gebauz.bauzoid2.math.Quaternion;
1767 chris 9
import com.gebauz.bauzoid2.math.Vector4;
1719 chris 10
 
11
/**
12
 * Created by chris on 12.12.2014.
13
 */
14
public class Model
15
{
16
    // Constants========================================================================================
17
 
18
    // Embedded Types===================================================================================
19
 
20
    // Fields===========================================================================================
21
 
22
    private String mName;
23
    private Mesh[] mMeshes = null;
24
 
1720 chris 25
    private ModelNode[] mNodes = null;
26
    private Material[] mMaterials = null;
1773 chris 27
        private Animation[] mAnimations = null;
1719 chris 28
 
29
    // Methods==========================================================================================
30
 
31
    public Model(String name)
32
    {
33
        mName = name;
34
    }
35
 
36
    public void dispose()
37
    {
1737 chris 38
        destroyNodes();
1719 chris 39
        destroyMeshes();
1720 chris 40
        destroyMaterials();
1719 chris 41
    }
42
 
43
    public void destroyMeshes()
44
    {
45
        if (mMeshes != null)
46
        {
47
            for (int i = 0; i < mMeshes.length; i++)
48
            {
49
                mMeshes[i].dispose();
50
                mMeshes[i] = null;
51
            }
52
 
53
            mMeshes = null;
54
        }
55
    }
56
 
1720 chris 57
    public void destroyMaterials()
1719 chris 58
    {
1720 chris 59
        if (mMaterials != null)
1719 chris 60
        {
1720 chris 61
            for (int i = 0; i < mMaterials.length; i++)
62
            {
63
                mMaterials[i].dispose();
64
                mMaterials[i] = null;
65
            }
66
            mMaterials = null;
1719 chris 67
        }
68
    }
69
 
1737 chris 70
    public void destroyNodes()
71
    {
72
        if (mNodes != null)
73
        {
74
            for (int i = 0; i < mNodes.length; i++)
75
            {
76
                mNodes[i] = null;
77
            }
78
            mNodes = null;
79
        }
80
    }
81
 
1774 chris 82
        public ModelNode findNode(String id)
83
        {
84
                for (ModelNode node : mNodes)
85
                {
86
                        if (node.getName().equalsIgnoreCase(id))
87
                                return node;
88
                }
89
 
90
                return null;
91
        }
92
 
1752 chris 93
    public void calcGlobalTransforms()
94
    {
95
        for (int i = 0; i < mNodes.length; i++)
96
        {
97
            ModelNode node = mNodes[i];
98
 
1818 chris 99
            /*com.badlogic.gdx.math.Vector3 translation = new com.badlogic.gdx.math.Vector3(
1816 chris 100
                node.transform.translation.x, node.transform.translation.y, node.transform.translation.z);
101
            com.badlogic.gdx.math.Quaternion rotation = new com.badlogic.gdx.math.Quaternion(
102
                node.transform.rotation.x, node.transform.rotation.y, node.transform.rotation.z, node.transform.rotation.w
103
            );
104
            com.badlogic.gdx.math.Vector3 scale = new com.badlogic.gdx.math.Vector3(
105
                node.transform.scale.x, node.transform.scale.y, node.transform.scale.z
106
            );
107
 
108
            node.localTransform.set(translation, rotation, scale);
109
 
110
            if (node.getParentIndex() != -1)
111
            {
112
                ModelNode parentNode = mNodes[node.getParentIndex()];
113
                node.globalTransform.set(parentNode.globalTransform).mul(node.localTransform);
114
            }
115
            else
116
            {
117
                node.globalTransform.set(node.localTransform);
1818 chris 118
            }*/
1816 chris 119
 
120
 
1778 chris 121
                        node.getGlobalTransform().copyFrom(node.transform.calcMatrix());
1808 chris 122
                        node.getGlobalBindPose().copyFrom(node.bindPose.calcMatrix());
1752 chris 123
            if (node.getParentIndex() != -1)
124
            {
125
                ModelNode parentNode = mNodes[node.getParentIndex()];
1758 chris 126
                node.getGlobalTransform().postMultiply(parentNode.getGlobalTransform());
1808 chris 127
                                node.getGlobalBindPose().postMultiply(parentNode.getGlobalBindPose());
1752 chris 128
            }
129
        }
130
    }
131
 
1720 chris 132
    public void render()
1719 chris 133
    {
1774 chris 134
                for (Animation anim : mAnimations)
135
                {
136
                        anim.setCurrentTime(Time.getRunTime() * 1000);
1818 chris 137
            anim.setCurrentTime(0);
1774 chris 138
                        anim.applyAnimation();
139
                }
140
 
1757 chris 141
        calcGlobalTransforms();
1752 chris 142
 
143
        for (int i = 0; i < mNodes.length; i++)
1720 chris 144
        {
1752 chris 145
            ModelNode node = mNodes[i];
146
 
1757 chris 147
            Engine.graphics.renderStates.pushModelMatrix();
1818 chris 148
            Engine.graphics.renderStates.model.postMultiply(node.getGlobalTransform());
1752 chris 149
 
150
            if (node.parts != null)
151
            {
152
                for (ModelPart part : node.parts)
153
                {
1803 chris 154
                                        // render bones
1777 chris 155
                                        part.getMaterial().beginRender();
1788 chris 156
                    part.getMaterial().setMatrixPalette(part.calcBoneMatrices());
1777 chris 157
                    //part.render();
158
                                        part.getMeshGroup().render();
159
                                        part.getMaterial().endRender();
1809 chris 160
 
1811 chris 161
                                        /*for (int j = 0; j < part.getBoneInfluences().length; j++)
1809 chris 162
                                        {
163
                                                ModelNode bone = part.getBoneInfluences()[j];
164
                                                Transform t = part.getBoneTransforms()[j];
165
 
166
                                                Engine.graphics.renderStates.pushModelMatrix();
167
                                                Engine.graphics.renderStates.model.copyFrom(bone.getGlobalTransform());
1814 chris 168
                                                //Engine.graphics.renderStates.model.preMultiply(t.calcMatrix());
1809 chris 169
                                                //Quaternion q = new Quaternion(0.5f, -0.5f, 0.5f, 0.5f);
170
                                                //Engine.graphics.renderStates.model.preMultiply(q.toMatrix());
171
                                                //Engine.graphics.renderStates.model.preMultiply(Matrix4.createScale(3));
172
                                                Engine.graphics.util.drawMarker(new Vector4(1, 1, 0, 1));
173
                                                Engine.graphics.renderStates.popModelMatrix();
1811 chris 174
                                        }*/
1752 chris 175
                }
176
            }
1767 chris 177
                        else
178
                        {
1814 chris 179
                                /*Engine.graphics.renderStates.pushModelMatrix();
1811 chris 180
                                //Quaternion q = new Quaternion(0.5f, -0.5f, 0.5f, 0.5f);
181
                                //Engine.graphics.renderStates.model.preMultiply(q.toMatrix());
1804 chris 182
                                //Engine.graphics.renderStates.model.preMultiply(Matrix4.createScale(3));
1767 chris 183
                                Engine.graphics.util.drawMarker(new Vector4(1, 1, 0, 1));
1814 chris 184
                                Engine.graphics.renderStates.popModelMatrix();*/
1767 chris 185
                        }
1752 chris 186
 
1757 chris 187
            Engine.graphics.renderStates.popModelMatrix();
1752 chris 188
        }
1719 chris 189
    }
190
 
1720 chris 191
    // Getters/Setters==================================================================================
1719 chris 192
 
1720 chris 193
    public final void setMeshes(Mesh[] meshes) { mMeshes = meshes; }
194
    public final Mesh[] getMeshes() { return mMeshes; }
1719 chris 195
 
1720 chris 196
    public final void setMaterials(Material[] materials) { mMaterials = materials; }
197
    public final Material[] getMaterials() { return mMaterials; }
1719 chris 198
 
1720 chris 199
    public final void setNodes(ModelNode[] nodes) { mNodes = nodes; }
200
    public final ModelNode[] getNodes() { return mNodes; }
1773 chris 201
 
202
        public final void setAnimations(Animation[] anims) { mAnimations = anims; }
203
        public final Animation[] getAnimations() { return mAnimations; }
1719 chris 204
}