Beispiel #1
0
        public void InitAssImp(Assimp.Scene aiRoot, Scene.Entity3D root)
        {
            if (aiRoot.HasAnimations == false)
            {
                return;
            }

            _skeleton = CreateBoneTree(aiRoot.RootNode, null);
            Console.WriteLine("Proc bones:" + _skeleton.Name + " C:" + _skeleton.Children.Count);
            foreach (Assimp.Mesh mesh in aiRoot.Meshes)
            {
                foreach (Assimp.Bone bone in mesh.Bones)
                {
                    if (!_bonesByName.TryGetValue(bone.Name, out Bone found))
                    {
                        continue;
                    }

                    bool skip = (from t in _bones let bname = bone.Name where t.Name == bname select t).Any();
                    if (skip)
                    {
                        continue;
                    }

                    found.Offset = ToTK(bone.OffsetMatrix);
                    _bones.Add(found);
                    _bonesToIndex[found.Name] = _bones.IndexOf(found);
                }
                Assimp.Mesh mesh1 = mesh;
                foreach (string bone in _bonesByName.Keys.Where(b => mesh1.Bones.All(b1 => b1.Name != b) && b.StartsWith("Bone")))
                {
                    _bonesByName[bone].Offset = _bonesByName[bone].Parent.Offset;
                    _bones.Add(_bonesByName[bone]);
                    _bonesToIndex[bone] = _bones.IndexOf(_bonesByName[bone]);
                }
            }
            ExtractAnimations(aiRoot);

            const float timestep = 1.0f / 30.0f;

            for (int i = 0; i < Animations.Count; i++)
            {
                SetAnimationIndex(i);
                float dt = 0.0f;
                for (float ticks = 0.0f; ticks < Animations[i].Duration; ticks += Animations[i].TicksPerSecond / 30.0f)
                {
                    dt += timestep;
                    Calculate(dt);
                    List <OpenTK.Matrix4> trans = new List <OpenTK.Matrix4>();
                    for (int a = 0; a < _bones.Count; a++)
                    {
                        OpenTK.Matrix4 rotMat = _bones[a].Offset * _bones[a].GlobalTransform;
                        trans.Add(rotMat);
                    }
                    Animations[i].Transforms.Add(trans);
                }
            }
            Console.WriteLine("Finished loading animations with " + _bones.Count + " bones");
        }
Beispiel #2
0
        public PyDynamic(PyType type, Scene.Entity3D ent)
        {
            Sent = ent;
            PhysicsManager.AddObj(this);
            Mat = PhysicsManager.py.CreateMaterial(0.7f, 0.7f, 0.1f);
            switch (type)
            {
            case PyType.Box:
                CreateBox(ent);
                break;

                break;
            }
        }
Beispiel #3
0
        public void CreateBox(Scene.Entity3D ent)
        {
            Scene.Bounds bb = ent.Bounds;
            ID = PhysicsManager.py.CreateRigidDynamic();

            BoxGeometry ge = new BoxGeometry(bb.W / 2, bb.H / 2, bb.D / 2);

            //            Shape = ID.CreateShape ( ge, Mat );
            ID.LinearVelocity = new System.Numerics.Vector3(0, 0, 0);
            Shape             = RigidActorExt.CreateExclusiveShape(ID, ge, Mat);



            //Pose = ID.GlobalPose;
            var   wm  = ent.WorldNoScale;
            float m11 = wm.M11;
            float m12 = wm.M12;
            float m13 = wm.M13;
            float m14 = wm.M14;

            float m21 = wm.M21;
            float m22 = wm.M22;
            float m23 = wm.M23;
            float m24 = wm.M24;

            float m31 = wm.M31;
            float m32 = wm.M32;
            float m33 = wm.M33;
            float m34 = wm.M34;

            float m41 = wm.M41;
            float m42 = wm.M42;
            float m43 = wm.M43;
            float m44 = wm.M44;

            System.Numerics.Matrix4x4 tm = new System.Numerics.Matrix4x4(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44);

            ID.GlobalPose = tm;

            ID.SetMassAndUpdateInertia(3);

            Physics.PhysicsManager.Scene.AddActor(ID);
        }
Beispiel #4
0
        public void CreateMesh(Scene.Entity3D ent)
        {
            System.Collections.Generic.List <OpenTK.Vector3> verts = ent.GetAllVerts();
            System.Collections.Generic.List <int>            tris  = ent.GetAllTris();


            System.Numerics.Vector3[] rvert = new System.Numerics.Vector3[verts.Count];

            int vi = 0;

            foreach (OpenTK.Vector3 v in verts)
            {
                rvert[vi] = new System.Numerics.Vector3(v.X, v.Y, v.Z);

                vi++;
            }

            int[] at = new int[tris.Count];

            for (int i = 0; i < tris.Count; i++)
            {
                at[i] = tris[i];
            }

            TriangleMeshDesc tm = new TriangleMeshDesc()
            {
                Flags     = 0,
                Triangles = at,
                Points    = rvert
            };

            Cooking cook = PhysicsManager.py.CreateCooking();

            MemoryStream str = new MemoryStream();
            TriangleMeshCookingResult cookr = cook.CookTriangleMesh(tm, str);

            str.Position = 0;

            TriangleMesh trim = PhysicsManager.py.CreateTriangleMesh(str);

            TriangleMeshGeometry trig = new TriangleMeshGeometry(trim);

            RID = PhysicsManager.py.CreateRigidStatic();

            Shape ns = RigidActorExt.CreateExclusiveShape(RID, trig, Mat);

            //RID.CreateShape ( trig, Mat );

            var wm = ent.WorldNoScale;

            float m11 = wm.M11;
            float m12 = wm.M12;
            float m13 = wm.M13;
            float m14 = wm.M14;

            float m21 = wm.M21;
            float m22 = wm.M22;
            float m23 = wm.M23;
            float m24 = wm.M24;

            float m31 = wm.M31;
            float m32 = wm.M32;
            float m33 = wm.M33;
            float m34 = wm.M34;

            float m41 = wm.M41;
            float m42 = wm.M42;
            float m43 = wm.M43;
            float m44 = wm.M44;

            System.Numerics.Matrix4x4 tp = new System.Numerics.Matrix4x4(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44);

            // RID.GlobalPose = System.Numerics.Matrix4x4.CreateRotationX(-(float)System.Math.PI / 2);
            //RID.GlobalPosePosition = ent.LocalPos;

            PhysicsManager.Scene.AddActor(RID);
        }
Beispiel #5
0
 public PyStatic(Scene.Entity3D ent)
 {
     Mat = PhysicsManager.py.CreateMaterial(0.7f, 0.7f, 0.1f);
     CreateMesh(ent);
     PhysicsManager.AddObj(this);
 }
Beispiel #6
0
 public virtual void Create(Scene.Entity3D ent)
 {
 }