protected override void setupScene()
        {
            base.setupScene ();

            // checkerboard floor
            #if true
            {
                SSTexture tex = SSAssetManager.GetInstance<SSTexture> (".", "checkerboard.png");
                const float tileSz = 4f;
                const int gridSz = 10;
                var tileVertices = new SSVertex_PosNormTex[SSTexturedNormalQuad.c_doubleFaceVertices.Length];
                SSTexturedNormalQuad.c_doubleFaceVertices.CopyTo(tileVertices, 0);
                for (int v = 0; v < tileVertices.Length; ++v) {
                    tileVertices[v].TexCoord *= (float)gridSz;
                }

                var quadMesh = new SSVertexMesh<SSVertex_PosNormTex>(tileVertices);
                quadMesh.textureMaterial = new SSTextureMaterial(tex);
                var tileObj = new SSObjectMesh(quadMesh);
                tileObj.Name = "Tiles";
                tileObj.Selectable = false;
                tileObj.Orient(Quaternion.FromAxisAngle(Vector3.UnitX, (float)Math.PI/2f));
                tileObj.Scale = new Vector3(tileSz * gridSz);
                //tileObj.boundingSphere = new SSObjectSphere(0f);
                scene.AddObject(tileObj);
            }
            #endif

            // skeleton mesh test
            #if true
            {
                SSSkeletalAnimation animIdle
                    = SSAssetManager.GetInstance<SSSkeletalAnimationMD5>("./boneman", "boneman_idle.md5anim");
                SSSkeletalAnimation animRunning
                    = SSAssetManager.GetInstance<SSSkeletalAnimationMD5>("./boneman", "boneman_running.md5anim");
                SSSkeletalAnimation animAttack
                = SSAssetManager.GetInstance<SSSkeletalAnimationMD5>("./boneman", "boneman_attack.md5anim");

                SSSkeletalMesh[] meshes
                    = SSAssetManager.GetInstance<SSSkeletalMeshMD5[]>("./boneman", "boneman.md5mesh");
                var tex = SSAssetManager.GetInstance<SSTexture>("./boneman", "skin.png");
                foreach (var skeliMesh in meshes) {

                #if true
                var renderMesh0 = new SSSkeletalRenderMesh(skeliMesh);
                var obj0 = new SSObjectMesh(renderMesh0);
                obj0.MainColor = Color4.DarkGray;
                obj0.Name = "grey bones (bind pose)";
                obj0.Pos = new Vector3(-18f, 0f, -18f);
                obj0.Orient(Quaternion.FromAxisAngle(Vector3.UnitX, -(float)Math.PI/2f));
                scene.AddObject(obj0);

                tracker0 = new SSSimpleObjectTrackingJoint(obj0);
                tracker0.jointPositionLocal = animIdle.computeJointFrame(11, 0).position;
                tracker0.neutralViewOrientationLocal = animIdle.computeJointFrame(11, 0).orientation;
                tracker0.neutralViewDirectionBindPose = Vector3.UnitY;
                tracker0.neutralViewUpBindPose = Vector3.UnitZ;
                renderMesh0.addCustomizedJoint(11, tracker0);
                #endif

                #if true
                var renderMesh1 = new SSSkeletalRenderMesh(skeliMesh);
                var obj1 = new SSObjectMesh(renderMesh1);
                obj1.MainColor = Color4.DarkRed;
                obj1.Name = "red bones (running loop)";
                obj1.Pos = new Vector3(6f, 0f, -12f);
                obj1.Orient(Quaternion.FromAxisAngle(Vector3.UnitX, -(float)Math.PI/2f));
                scene.AddObject(obj1);

                renderMesh1.playAnimationLoop(animRunning, 0f);
                #endif

                #if true
                var renderMesh2 = new SSSkeletalRenderMesh(skeliMesh);
                renderMesh2.playAnimationLoop(animIdle, 0f, "all");
                renderMesh2.playAnimationLoop(animRunning, 0f, "LeftClavicle", "RightClavicle");
                var obj2 = new SSObjectMesh(renderMesh2);
                obj2.MainColor = Color.Green;
                obj2.Name = "green bones (idle + running loop mixed)";
                obj2.Pos = new Vector3(0f, 0f, -12f);
                obj2.Orient(Quaternion.FromAxisAngle(Vector3.UnitX, -(float)Math.PI/2f));
                scene.AddObject(obj2);
                #endif

                #if true
                var renderMesh3 = new SSSkeletalRenderMesh(skeliMesh);
                renderMesh3.playAnimationLoop(animIdle, 0f, "all");
                var obj3 = new SSObjectMesh(renderMesh3);
                obj3.MainColor = Color.DarkCyan;
                obj3.Name = "blue bones (idle loop)";
                obj3.Pos = new Vector3(-6f, 0f, -12f);
                obj3.Orient(Quaternion.FromAxisAngle(Vector3.UnitX, -(float)Math.PI/2f));
                scene.AddObject(obj3);
                #endif

                // state machines setup for skeletal render mesh 4 and 5
                var skeletonWalkDescr = new SSAnimationStateMachine();
                skeletonWalkDescr.addState("idle", animIdle, true);
                skeletonWalkDescr.addState("running1", animRunning);
                skeletonWalkDescr.addState("running2", animRunning);
                skeletonWalkDescr.addAnimationEndsTransition("idle", "running1", 0.3f);
                skeletonWalkDescr.addAnimationEndsTransition("running1", "running2", 0f);
                skeletonWalkDescr.addAnimationEndsTransition("running2", "idle", 0.3f);

                var skeletonAttackDescr = new SSAnimationStateMachine();
                skeletonAttackDescr.addState("inactive", null, true);
                skeletonAttackDescr.addState("attack", animAttack);
                skeletonAttackDescr.addStateTransition(null, "attack", 0.5f);
                skeletonAttackDescr.addAnimationEndsTransition("attack", "inactive", 0.5f);

                #if true
                // state machine test (in slow motion)
                var renderMesh4 = new SSSkeletalRenderMesh(skeliMesh);
                renderMesh4.timeScale = 0.25f;

                var obj4 = new SSObjectMesh(renderMesh4);
                obj4.MainColor = Color.DarkMagenta;
                obj4.Name = "magenta bones (looping idle/walk; interactive attack; slowmo)";
                obj4.Pos = new Vector3(-12f, 0f, 0f);
                obj4.Orient(Quaternion.FromAxisAngle(Vector3.UnitX, -(float)Math.PI/2f));
                scene.AddObject(obj4);

                var renderMesh4WallSm = renderMesh4.addStateMachine(skeletonWalkDescr, "all");
                renderMesh4AttackSm = renderMesh4.addStateMachine(skeletonAttackDescr, "LeftClavicle", "RightClavicle");

                tracker4 = new SSSimpleObjectTrackingJoint(obj4);
                tracker4.jointPositionLocal = animRunning.computeJointFrame(11, 0).position;
                tracker4.neutralViewOrientationLocal = animRunning.computeJointFrame(11, 0).orientation;
                tracker4.neutralViewDirectionBindPose = Vector3.UnitY;
                renderMesh4.addCustomizedJoint(11, tracker4);
                #endif

                #if true
                // another mesh, using the same state machine but running at normal speed
                var renderMesh5 = new SSSkeletalRenderMesh(skeliMesh);
                var renderMesh5WalkSm = renderMesh5.addStateMachine(skeletonWalkDescr, "all");
                renderMesh5AttackSm = renderMesh5.addStateMachine(skeletonAttackDescr, "LeftClavicle", "RightClavicle");
                var obj5 = new SSObjectMesh(renderMesh5);
                obj5.Name = "orange bones (looping idle/walk, interactive attack + parametric neck rotation)";
                obj5.Pos = new Vector3(12f, 0f, 0f);
                obj5.Orient(Quaternion.FromAxisAngle(Vector3.UnitX, -(float)Math.PI/2f));
                obj5.MainColor = Color4.DarkOrange;
                scene.AddObject(obj5);

                renderMesh5NeckJoint = new SSPolarJoint();
                renderMesh5NeckJoint.positionOffset = new Vector3(0f, 0.75f, 0f);
                renderMesh5.addCustomizedJoint("UpperNek", renderMesh5NeckJoint);
                #endif
                }
            }
            #endif

            #if true
            // bob mesh test
            {
                var bobMeshes = SSAssetManager.GetInstance<SSSkeletalMeshMD5[]>(
                    "./bob_lamp/", "bob_lamp_update.md5mesh");
                var bobAnim = SSAssetManager.GetInstance<SSSkeletalAnimationMD5>(
                    "./bob_lamp/", "bob_lamp_update.md5anim");
                var bobRender = new SSSkeletalRenderMesh(bobMeshes);
                bobRender.playAnimationLoop(bobAnim, 0f);
                bobRender.alphaBlendingEnabled = true;
                bobRender.timeScale = 0.5f;
                var bobObj = new SSObjectMesh(bobRender);
                bobObj.Name = "Bob";
                bobObj.Pos = new Vector3(10f, 0f, 10f);
                bobObj.Orient(Quaternion.FromAxisAngle(Vector3.UnitX, -(float)Math.PI/2f));
                scene.AddObject(bobObj);
            }
            #endif
        }
Example #2
0
        protected override void setupScene()
        {
            base.setupScene();

            // checkerboard floor
                        #if true
            {
                SSTexture   tex          = SSAssetManager.GetInstance <SSTexture> (".", "checkerboard.png");
                const float tileSz       = 4f;
                const int   gridSz       = 10;
                var         tileVertices = new SSVertex_PosNormTex[SSTexturedNormalQuad.c_doubleFaceVertices.Length];
                SSTexturedNormalQuad.c_doubleFaceVertices.CopyTo(tileVertices, 0);
                for (int v = 0; v < tileVertices.Length; ++v)
                {
                    tileVertices[v].TexCoord *= (float)gridSz;
                }

                var quadMesh = new SSVertexMesh <SSVertex_PosNormTex>(tileVertices);
                quadMesh.textureMaterial = new SSTextureMaterial(tex);
                var tileObj = new SSObjectMesh(quadMesh);
                tileObj.Name       = "Tiles";
                tileObj.selectable = false;
                tileObj.Orient(Quaternion.FromAxisAngle(Vector3.UnitX, (float)Math.PI / 2f));
                tileObj.Scale = new Vector3(tileSz * gridSz);
                //tileObj.boundingSphere = new SSObjectSphere(0f);
                main3dScene.AddObject(tileObj);
            }
                        #endif

            // skeleton mesh test
                        #if true
            {
                SSSkeletalAnimation animIdle
                    = SSAssetManager.GetInstance <SSSkeletalAnimationMD5>("./boneman", "boneman_idle.md5anim");
                SSSkeletalAnimation animRunning
                    = SSAssetManager.GetInstance <SSSkeletalAnimationMD5>("./boneman", "boneman_running.md5anim");
                SSSkeletalAnimation animAttack
                    = SSAssetManager.GetInstance <SSSkeletalAnimationMD5>("./boneman", "boneman_attack.md5anim");

                SSSkeletalMesh[] meshes
                    = SSAssetManager.GetInstance <SSSkeletalMeshMD5[]>("./boneman", "boneman.md5mesh");
                var tex = SSAssetManager.GetInstance <SSTexture>("./boneman", "skin.png");
                foreach (var skeliMesh in meshes)
                {
                                #if true
                    var renderMesh0 = new SSSkeletalRenderMesh(skeliMesh);
                    var obj0        = new SSObjectMesh(renderMesh0);
                    obj0.MainColor = Color4.DarkGray;
                    obj0.Name      = "grey bones (bind pose)";
                    obj0.Pos       = new Vector3(-18f, 0f, -18f);
                    obj0.Orient(Quaternion.FromAxisAngle(Vector3.UnitX, -(float)Math.PI / 2f));
                    main3dScene.AddObject(obj0);

                    tracker0 = new SSSimpleObjectTrackingJoint(obj0);
                    tracker0.jointPositionLocal           = animIdle.computeJointFrame(11, 0).position;
                    tracker0.neutralViewOrientationLocal  = animIdle.computeJointFrame(11, 0).orientation;
                    tracker0.neutralViewDirectionBindPose = Vector3.UnitY;
                    tracker0.neutralViewUpBindPose        = Vector3.UnitZ;
                    renderMesh0.addCustomizedJoint(11, tracker0);
                                #endif

                                #if true
                    var renderMesh1 = new SSSkeletalRenderMesh(skeliMesh);
                    var obj1        = new SSObjectMesh(renderMesh1);
                    obj1.MainColor = Color4.DarkRed;
                    obj1.Name      = "red bones (running loop)";
                    obj1.Pos       = new Vector3(6f, 0f, -12f);
                    obj1.Orient(Quaternion.FromAxisAngle(Vector3.UnitX, -(float)Math.PI / 2f));
                    main3dScene.AddObject(obj1);

                    renderMesh1.playAnimationLoop(animRunning, 0f);
                                #endif

                                #if true
                    var renderMesh2 = new SSSkeletalRenderMesh(skeliMesh);
                    renderMesh2.playAnimationLoop(animIdle, 0f, "all");
                    renderMesh2.playAnimationLoop(animRunning, 0f, "LeftClavicle", "RightClavicle");
                    var obj2 = new SSObjectMesh(renderMesh2);
                    obj2.MainColor = Color.Green;
                    obj2.Name      = "green bones (idle + running loop mixed)";
                    obj2.Pos       = new Vector3(0f, 0f, -12f);
                    obj2.Orient(Quaternion.FromAxisAngle(Vector3.UnitX, -(float)Math.PI / 2f));
                    main3dScene.AddObject(obj2);
                                #endif

                                #if true
                    var renderMesh3 = new SSSkeletalRenderMesh(skeliMesh);
                    renderMesh3.playAnimationLoop(animIdle, 0f, "all");
                    var obj3 = new SSObjectMesh(renderMesh3);
                    obj3.MainColor = Color.DarkCyan;
                    obj3.Name      = "blue bones (idle loop)";
                    obj3.Pos       = new Vector3(-6f, 0f, -12f);
                    obj3.Orient(Quaternion.FromAxisAngle(Vector3.UnitX, -(float)Math.PI / 2f));
                    main3dScene.AddObject(obj3);
                                #endif

                    // state machines setup for skeletal render mesh 4 and 5
                    var skeletonWalkDescr = new SSAnimationStateMachine();
                    skeletonWalkDescr.addState("idle", animIdle, true);
                    skeletonWalkDescr.addState("running1", animRunning);
                    skeletonWalkDescr.addState("running2", animRunning);
                    skeletonWalkDescr.addAnimationEndsTransition("idle", "running1", 0.3f);
                    skeletonWalkDescr.addAnimationEndsTransition("running1", "running2", 0f);
                    skeletonWalkDescr.addAnimationEndsTransition("running2", "idle", 0.3f);

                    var skeletonAttackDescr = new SSAnimationStateMachine();
                    skeletonAttackDescr.addState("inactive", null, true);
                    skeletonAttackDescr.addState("attack", animAttack);
                    skeletonAttackDescr.addStateTransition(null, "attack", 0.5f);
                    skeletonAttackDescr.addAnimationEndsTransition("attack", "inactive", 0.5f);

                                #if true
                    // state machine test (in slow motion)
                    var renderMesh4 = new SSSkeletalRenderMesh(skeliMesh);
                    renderMesh4.timeScale = 0.25f;

                    var obj4 = new SSObjectMesh(renderMesh4);
                    obj4.MainColor = Color.DarkMagenta;
                    obj4.Name      = "magenta bones (looping idle/walk; interactive attack; slowmo)";
                    obj4.Pos       = new Vector3(-12f, 0f, 0f);
                    obj4.Orient(Quaternion.FromAxisAngle(Vector3.UnitX, -(float)Math.PI / 2f));
                    main3dScene.AddObject(obj4);

                    var renderMesh4WallSm = renderMesh4.addStateMachine(skeletonWalkDescr, "all");
                    renderMesh4AttackSm = renderMesh4.addStateMachine(skeletonAttackDescr, "LeftClavicle", "RightClavicle");

                    tracker4 = new SSSimpleObjectTrackingJoint(obj4);
                    tracker4.jointPositionLocal           = animRunning.computeJointFrame(11, 0).position;
                    tracker4.neutralViewOrientationLocal  = animRunning.computeJointFrame(11, 0).orientation;
                    tracker4.neutralViewDirectionBindPose = Vector3.UnitY;
                    renderMesh4.addCustomizedJoint(11, tracker4);
                                #endif

                                #if true
                    // another mesh, using the same state machine but running at normal speed
                    var renderMesh5       = new SSSkeletalRenderMesh(skeliMesh);
                    var renderMesh5WalkSm = renderMesh5.addStateMachine(skeletonWalkDescr, "all");
                    renderMesh5AttackSm = renderMesh5.addStateMachine(skeletonAttackDescr, "LeftClavicle", "RightClavicle");
                    var obj5 = new SSObjectMesh(renderMesh5);
                    obj5.Name = "orange bones (looping idle/walk, interactive attack + parametric neck rotation)";
                    obj5.Pos  = new Vector3(12f, 0f, 0f);
                    obj5.Orient(Quaternion.FromAxisAngle(Vector3.UnitX, -(float)Math.PI / 2f));
                    obj5.MainColor = Color4.DarkOrange;
                    main3dScene.AddObject(obj5);

                    renderMesh5NeckJoint = new SSPolarJoint();
                    renderMesh5NeckJoint.positionOffset = new Vector3(0f, 0.75f, 0f);
                    renderMesh5.addCustomizedJoint("UpperNek", renderMesh5NeckJoint);
                                #endif
                }
            }
                        #endif

                        #if true
            // bob mesh test
            {
                var bobMeshes = SSAssetManager.GetInstance <SSSkeletalMeshMD5[]>(
                    "./bob_lamp/", "bob_lamp_update.md5mesh");
                var bobAnim = SSAssetManager.GetInstance <SSSkeletalAnimationMD5>(
                    "./bob_lamp/", "bob_lamp_update.md5anim");
                var bobRender = new SSSkeletalRenderMesh(bobMeshes);
                bobRender.playAnimationLoop(bobAnim, 0f);
                bobRender.alphaBlendingEnabled = true;
                bobRender.timeScale            = 0.5f;
                var bobObj = new SSObjectMesh(bobRender);
                bobObj.Name = "Bob";
                bobObj.Pos  = new Vector3(10f, 0f, 10f);
                bobObj.Orient(Quaternion.FromAxisAngle(Vector3.UnitX, -(float)Math.PI / 2f));
                alpha3dScene.AddObject(bobObj);
            }
                        #endif
        }