Subversion Repositories AndroidProjects

Rev

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

Rev Author Line No. Line
1720 chris 1
package com.gebauz.bauzoid2.graphics.model;
2
 
1817 chris 3
import com.gebauz.bauzoid2.game.Engine;
1801 chris 4
import com.gebauz.bauzoid2.graphics.util.Transform;
1782 chris 5
import com.gebauz.bauzoid2.math.Matrix4;
1778 chris 6
import com.gebauz.bauzoid2.math.Quaternion;
7
import com.gebauz.bauzoid2.math.Vector3;
8
 
1720 chris 9
/**
10
 * Created by chris on 14.12.2014.
11
 */
12
public class ModelPart
13
{
14
    // Constants========================================================================================
15
 
16
 
1778 chris 17
 
1720 chris 18
    // Fields===========================================================================================
19
 
20
    private String mName = null;
21
 
22
    private MeshGroup mMeshGroup = null;
23
    private Material mMaterial = null;
24
 
1779 chris 25
        private ModelNode[] mBoneInfluences = null;
1814 chris 26
        private Transform[] mBoneTransforms = null; // bind pose?
27
        private Matrix4[] mBoneTransformMatrices = null;
1816 chris 28
    public com.badlogic.gdx.math.Matrix4[] mGdxBones = null;
1779 chris 29
 
1720 chris 30
    // Methods==========================================================================================
31
 
32
    public ModelPart(String name, MeshGroup group, Material material)
33
    {
34
        mName = name;
35
 
36
        mMeshGroup = group;
37
        mMaterial = material;
38
    }
39
 
1788 chris 40
    public Matrix4[] calcBoneMatrices()
41
    {
1804 chris 42
        Matrix4[] matrices = new Matrix4[mBoneInfluences.length];
43
        for (int i = 0; i < matrices.length; i++)
1800 chris 44
        {
45
            ModelNode bone = mBoneInfluences[i];
1788 chris 46
 
1804 chris 47
            //Quaternion q = new Quaternion(0.5f, -0.5f, 0.5f, 0.5f);
1800 chris 48
 
1804 chris 49
                        matrices[i] = new Matrix4();
1816 chris 50
                        /*matrices[i].identity();
1806 chris 51
            matrices[i].multiply(bone.getGlobalTransform());
1808 chris 52
 
1814 chris 53
            Matrix4 a = new Matrix4();
54
            bone.getGlobalTransform().copyTo(a);
55
 
56
            Matrix4 b = new Matrix4();
57
            mBoneTransformMatrices[i].copyTo(b);
58
 
1816 chris 59
                        matrices[i].multiply(mBoneTransformMatrices[i].getInverse());*/
60
 
1817 chris 61
            /*Matrix4 test = new Matrix4();
62
            test.copyFrom(bone.getGlobalTransform());
63
            test.multiply(mBoneTransformMatrices[i].getInverse());*/
64
 
65
            Matrix4 test = Matrix4.multiply(mBoneTransformMatrices[i].getInverse(), bone.getGlobalTransform());
66
 
1818 chris 67
            /*com.badlogic.gdx.math.Matrix4 invBone = new com.badlogic.gdx.math.Matrix4(mGdxBones[i]).inv();
1816 chris 68
            com.badlogic.gdx.math.Matrix4 resultMatrix = new com.badlogic.gdx.math.Matrix4();
1818 chris 69
            resultMatrix.set(bone.globalTransform).mul(invBone);*/
1816 chris 70
 
1817 chris 71
            //matrices[i].set(resultMatrix.getValues());
72
            matrices[i] = test;
73
 
74
            /*Engine.log("Global Transform:");
75
            output(bone.getGlobalTransform().values);
76
            output(bone.globalTransform.getValues());
77
 
78
            Engine.log("Bind Matrix");
79
            output(mBoneTransformMatrices[i].values);
80
            output(mGdxBones[i].getValues());
81
 
82
            Engine.log("Inverse Bind Matrix");
83
            output(mBoneTransformMatrices[i].getInverse().values);
84
            output(invBone.getValues());
85
 
86
            Engine.log("Global*InvBind");
87
            output(test.values);
88
            output(resultMatrix.getValues());
89
 
90
            Engine.log("i = " + i);*/
1800 chris 91
        }
92
 
1817 chris 93
        //Engine.log("-----------------------");
94
 
95
        /*Matrix4 mA = new Matrix4();
96
        mA.values[ 0] = 0; mA.values[ 1] = 1; mA.values[ 2] = 0; mA.values[ 3] = 0;
97
        mA.values[ 4] = -1; mA.values[ 5] = 0; mA.values[ 6] = 0; mA.values[ 7] = 0;
98
        mA.values[ 8] = 0; mA.values[ 9] = 0; mA.values[10] = 1; mA.values[11] = 0;
99
        mA.values[12] = 0; mA.values[13] = 0; mA.values[14] = 0; mA.values[15] = 1;
100
 
101
        Matrix4 mB = new Matrix4();
102
        mB.values[ 0] = 0; mB.values[ 1] = -1; mB.values[ 2] = 0; mB.values[ 3] = 0;
103
        mB.values[ 4] = 0; mB.values[ 5] = 0; mB.values[ 6] = -1; mB.values[ 7] = 0;
104
        mB.values[ 8] = 1; mB.values[ 9] = 0; mB.values[10] = 0; mB.values[11] = 0;
105
        mB.values[12] = 0; mB.values[13] = 0; mB.values[14] = 0; mB.values[15] = 1;
106
 
107
        Matrix4 r = Matrix4.multiply(mB, mA);
108
        output(r.values);*/
109
 
1804 chris 110
        return matrices;
1788 chris 111
    }
112
 
1817 chris 113
    public void output(float[] v)
114
    {
115
        Engine.log(String.format("| %.2f %.2f %.2f %.2f |", v[0], v[1], v[2], v[3]));
116
        Engine.log(String.format("| %.2f %.2f %.2f %.2f |", v[4], v[5], v[6], v[7]));
117
        Engine.log(String.format("| %.2f %.2f %.2f %.2f |", v[8], v[9], v[10], v[11]));
118
        Engine.log(String.format("| %.2f %.2f %.2f %.2f |", v[12], v[13], v[14], v[15]));
119
        Engine.log("--");
120
    }
121
 
1720 chris 122
    // Getters/Setters==================================================================================
1723 chris 123
 
1777 chris 124
        public final Material getMaterial() { return mMaterial; }
1723 chris 125
 
1777 chris 126
        public final MeshGroup getMeshGroup() { return mMeshGroup; }
127
 
1804 chris 128
        private final void setBoneInfluences(ModelNode[] influences)
1780 chris 129
        {
130
                mBoneInfluences = influences;
1801 chris 131
        }
1809 chris 132
        public final ModelNode[] getBoneInfluences() { return mBoneInfluences; }
1780 chris 133
 
1804 chris 134
        private final void setBoneTransforms(Transform[] transforms)
1801 chris 135
        {
136
                mBoneTransforms = transforms;
1804 chris 137
        }
1809 chris 138
        public final Transform[] getBoneTransforms() { return mBoneTransforms; }
1801 chris 139
 
1804 chris 140
        public final void setBones(ModelNode[] influences, Transform[] transforms)
141
        {
142
                setBoneInfluences(influences);
143
                setBoneTransforms(transforms);
1814 chris 144
 
145
        mBoneTransformMatrices = new Matrix4[transforms.length];
1816 chris 146
        mGdxBones = new com.badlogic.gdx.math.Matrix4[transforms.length];
1814 chris 147
        for (int i = 0; i < transforms.length; i++)
148
        {
149
            mBoneTransformMatrices[i] = Matrix4.createIdentity();
1817 chris 150
            mBoneTransformMatrices[i].multiply(Matrix4.createScale(transforms[i].scale));
151
            mBoneTransformMatrices[i].multiply(transforms[i].rotation.toMatrix());
1814 chris 152
            mBoneTransformMatrices[i].multiply(Matrix4.createTranslation(transforms[i].translation));
1816 chris 153
 
1817 chris 154
 
1816 chris 155
            com.badlogic.gdx.math.Quaternion tempQ = new com.badlogic.gdx.math.Quaternion();
156
 
157
            mGdxBones[i] = new com.badlogic.gdx.math.Matrix4();
158
            mGdxBones[i].translate(transforms[i].translation.x,transforms[i].translation.y, transforms[i].translation.z);
159
            mGdxBones[i].rotate(tempQ.set(transforms[i].rotation.x, transforms[i].rotation.y, transforms[i].rotation.z, transforms[i].rotation.w));
160
            mGdxBones[i].scale(transforms[i].scale.x, transforms[i].scale.y, transforms[i].scale.z);
1814 chris 161
        }
1780 chris 162
        }
1782 chris 163
 
1804 chris 164
        public final boolean isSkinned()
165
        {
166
                return (mBoneInfluences != null);
167
        }
1782 chris 168
 
1804 chris 169
 
1720 chris 170
}