Subversion Repositories AndroidProjects

Rev

Rev 1808 | Rev 1811 | Go to most recent revision | 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
 
1778 chris 99
                        node.getGlobalTransform().copyFrom(node.transform.calcMatrix());
1808 chris 100
                        node.getGlobalBindPose().copyFrom(node.bindPose.calcMatrix());
1752 chris 101
            if (node.getParentIndex() != -1)
102
            {
103
                ModelNode parentNode = mNodes[node.getParentIndex()];
1758 chris 104
                node.getGlobalTransform().postMultiply(parentNode.getGlobalTransform());
1808 chris 105
                                node.getGlobalBindPose().postMultiply(parentNode.getGlobalBindPose());
1752 chris 106
            }
107
        }
108
    }
109
 
1720 chris 110
    public void render()
1719 chris 111
    {
1774 chris 112
                for (Animation anim : mAnimations)
113
                {
114
                        anim.setCurrentTime(Time.getRunTime() * 1000);
115
                        anim.applyAnimation();
116
                }
117
 
1757 chris 118
        calcGlobalTransforms();
1752 chris 119
 
120
        for (int i = 0; i < mNodes.length; i++)
1720 chris 121
        {
1752 chris 122
            ModelNode node = mNodes[i];
123
 
1757 chris 124
            Engine.graphics.renderStates.pushModelMatrix();
125
            Engine.graphics.renderStates.model.preMultiply(node.getGlobalTransform());
1768 chris 126
                        //Engine.graphics.renderStates.model.preMultiply(node.getLocalTransform());
1752 chris 127
 
1768 chris 128
 
1752 chris 129
            if (node.parts != null)
130
            {
131
                for (ModelPart part : node.parts)
132
                {
1803 chris 133
                                        // render bones
1777 chris 134
                                        part.getMaterial().beginRender();
1788 chris 135
                    part.getMaterial().setMatrixPalette(part.calcBoneMatrices());
1777 chris 136
                    //part.render();
137
                                        part.getMeshGroup().render();
138
                                        part.getMaterial().endRender();
1809 chris 139
 
140
                                        for (int j = 0; j < part.getBoneInfluences().length; j++)
141
                                        {
142
                                                ModelNode bone = part.getBoneInfluences()[j];
143
                                                Transform t = part.getBoneTransforms()[j];
144
 
145
                                                Engine.graphics.renderStates.pushModelMatrix();
146
                                                Engine.graphics.renderStates.model.copyFrom(bone.getGlobalTransform());
147
                                                Engine.graphics.renderStates.model.preMultiply(t.rotation.toMatrix());
148
                                                //Quaternion q = new Quaternion(0.5f, -0.5f, 0.5f, 0.5f);
149
                                                //Engine.graphics.renderStates.model.preMultiply(q.toMatrix());
150
                                                //Engine.graphics.renderStates.model.preMultiply(Matrix4.createScale(3));
151
                                                Engine.graphics.util.drawMarker(new Vector4(1, 1, 0, 1));
152
                                                Engine.graphics.renderStates.popModelMatrix();
153
                                        }
1752 chris 154
                }
155
            }
1767 chris 156
                        else
157
                        {
1809 chris 158
                                /*Engine.graphics.renderStates.pushModelMatrix();
1776 chris 159
                                Quaternion q = new Quaternion(0.5f, -0.5f, 0.5f, 0.5f);
160
                                Engine.graphics.renderStates.model.preMultiply(q.toMatrix());
1804 chris 161
                                //Engine.graphics.renderStates.model.preMultiply(Matrix4.createScale(3));
1767 chris 162
                                Engine.graphics.util.drawMarker(new Vector4(1, 1, 0, 1));
1809 chris 163
                                Engine.graphics.renderStates.popModelMatrix();*/
1767 chris 164
                        }
1752 chris 165
 
1757 chris 166
            Engine.graphics.renderStates.popModelMatrix();
1752 chris 167
        }
1719 chris 168
    }
169
 
1720 chris 170
    // Getters/Setters==================================================================================
1719 chris 171
 
1720 chris 172
    public final void setMeshes(Mesh[] meshes) { mMeshes = meshes; }
173
    public final Mesh[] getMeshes() { return mMeshes; }
1719 chris 174
 
1720 chris 175
    public final void setMaterials(Material[] materials) { mMaterials = materials; }
176
    public final Material[] getMaterials() { return mMaterials; }
1719 chris 177
 
1720 chris 178
    public final void setNodes(ModelNode[] nodes) { mNodes = nodes; }
179
    public final ModelNode[] getNodes() { return mNodes; }
1773 chris 180
 
181
        public final void setAnimations(Animation[] anims) { mAnimations = anims; }
182
        public final Animation[] getAnimations() { return mAnimations; }
1719 chris 183
}