Beispiel #1
0
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            // this can be used to force other culture settings for testing..
            // System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("nl-NL");

            // The 'using' idiom guarantees proper resource cleanup.
            // We request 30 UpdateFrame events per second, and unlimited
            // RenderFrame events (as fast as the computer can handle).
            using (WavefrontOBJViewer game = new WavefrontOBJViewer())
            {
                Console.WriteLine("GL Version = {0}", GL.GetString(StringName.Version));
                Console.WriteLine("GL Shader Version = {0}", GL.GetString(StringName.ShadingLanguageVersion));

                // setup asset manager contexts
                // these help the asset manager find the "Asset" directy up above the bin/obj/Debug
                // output directories...
                SSAssetManager.AddAssetArchive(new SSAssetArchiveHandler_FileSystem("./Assets"));
                SSAssetManager.AddAssetArchive(new SSAssetArchiveHandler_FileSystem("../../Assets"));
                SSAssetManager.AddAssetArchive(new SSAssetArchiveHandler_FileSystem("../../../Assets"));
                SSAssetManager.AddAssetArchive(new SSAssetArchiveHandler_FileSystem("../../../../Assets"));

                game.shaderPgm = new SSMainShaderProgram();                 // before scene

                game.setupInput();

                game.setupScene();
                game.setupEnvironment();
                game.setupHUD();

                // game.VSync = VSyncMode.Off;
                game.Run(30.0);
            }
        }
Beispiel #2
0
        protected override void setupScene()
        {
            base.setupScene();

            laserOccDiskScene3d = new SSScene(mainShader, pssmShader, instancingShader, instancingPssmShader);
            laserFlareScene2d   = new SSScene(mainShader, pssmShader, instancingShader, instancingPssmShader);

            var mesh = SSAssetManager.GetInstance <SSMesh_wfOBJ>("./drone2/Drone2.obj");

            // add drones
            droneObj1     = new SSObjectMesh(mesh);
            droneObj1.Pos = new OpenTK.Vector3(-20f, 0f, -15f);
            droneObj1.Orient(Quaternion.FromAxisAngle(Vector3.UnitY, (float)Math.PI / 2f));
            //droneObj1.renderState.visible = false;
            droneObj1.Name = "attacker drone";
            main3dScene.AddObject(droneObj1);

            droneObj2           = new SSObjectMesh(mesh);
            droneObj2.Pos       = new OpenTK.Vector3(20f, 0f, -15f);
            droneObj2.Name      = "target drone";
            droneObj2.MainColor = new Color4(1f, 0f, 0.7f, 1f);
            //droneObj2.renderState.visible = false;
            main3dScene.AddObject(droneObj2);

            // manages laser objects
            laserManager = new SLaserManager(alpha3dScene, laserOccDiskScene3d, laserFlareScene2d);

            // tweak the laser start point (by adding an offset in object-local coordinates)
            laserSourceTxfm = Matrix4.CreateTranslation(0f, 1f, 2.75f);

            // debugging snippets:
            //droneObj1.MainColor = Color4.Green;
            //droneObj1.renderState.visible = false;
        }
Beispiel #3
0
 public static SSSkeletalAnimationMD5 ReadAnimation(SSAssetManager.Context ctx, string filename)
 {
     var parser = new SSMD5AnimParser(ctx, filename);
     var anim = parser.readAnimation ();
     anim.name = filename;
     return anim;
 }
Beispiel #4
0
        public SSkyboxRenderer(SSTexture[] textures = null)
        {
            this.renderState.depthTest      = true;
            this.renderState.lighted        = false;
            this.renderState.frustumCulling = false;
            this.renderState.noShader       = true;

            this.textures = new SSTexture[(int)Face.NumFaces];
            for (int i = 0; i < (int)Face.NumFaces; ++i)
            {
                SSTexture tex = (textures != null) ? textures [i] : null;
                tex = tex ?? SSAssetManager.GetInstance <SSTexture>(defaultTextures [i]);
                this.textures [i] = tex;
            }
        }
Beispiel #5
0
        public void setupEnvironment()
        {
            // add skybox cube
            var      mesh       = SSAssetManager.GetInstance <SSMesh_wfOBJ>("./skybox/", "skybox.obj");
            SSObject skyboxCube = new SSObjectMeshSky(mesh);

            environmentScene.AddObject(skyboxCube);
            skyboxCube.Scale = new Vector3(0.7f);
            skyboxCube.renderState.lighted = false;

            // scene.addObject(skyboxCube);

            SSObject skyboxStars = new SSObjectMeshSky(new SSMesh_Starfield(1600));

            environmentScene.AddObject(skyboxStars);
            skyboxStars.renderState.lighted = false;
        }
        protected virtual void setupEnvironment()
        {
            // add skybox cube
            var mesh = SSAssetManager.GetInstance <SSMesh_wfOBJ>("skybox/skybox.obj");

            skyboxCube = new SSObjectMesh(mesh);
            skyboxCube.renderState.depthTest  = true;
            skyboxCube.renderState.depthWrite = true;
            skyboxCube.renderState.lighted    = false;
            skyboxCube.selectable             = false;
            environmentScene.AddObject(skyboxCube);

            // add stars
            skyboxStars            = new SStarfieldObject(1600);
            skyboxStars.selectable = false;
            environmentScene.AddObject(skyboxStars);

            #if true
            // setup a sun billboard object and a sun flare spriter renderer
            {
                var sunDiskMesh = new SSMeshDisk();
                sunDisk = new SSObjectOcclusionQueuery(sunDiskMesh);
                sunDisk.renderState.doBillboarding = true;
                sunDisk.MainColor = new Color4(1f, 1f, 0.8f, 1f);
                sunDisk.Scale     = new Vector3(25f);
                sunDisk.renderState.matchScaleToScreenPixels = true;
                sunDisk.renderState.depthFunc      = DepthFunction.Lequal;
                sunDisk.renderState.frustumCulling = false;
                sunDisk.renderState.lighted        = false;
                sunDisk.renderState.castsShadow    = false;
                sunDiskScene.AddObject(sunDisk);

                var sunFlare = new SSSunFlareRenderer(sunDiskScene, sunDisk);
                sunFlare.renderState.depthTest  = false;
                sunFlare.renderState.depthWrite = false;
                sunFlare.Name = "sun flare renderer";
                sunFlareScene.AddObject(sunFlare);
            }
            #endif
        }
        protected override void setupScene()
        {
            base.setupScene();

            var mesh = SSAssetManager.GetInstance <SSMesh_wfOBJ> ("./shuttle_pod/pod-multiobj.obj");

            // add test object
            SSObject testObj = new SSObjectMesh(mesh);

            main3dScene.AddObject(testObj);
            testObj.renderState.lighted = true;
            testObj.colorMaterial       = new SSColorMaterial(
                new Color4(0.3f, 0.3f, 0.3f, 0.3f), // diffuse
                new Color4(0.1f, 0.1f, 0.1f, 0.1f), // ambient
                new Color4(0.3f, 0.3f, 0.3f, 0.3f), // specular
                new Color4(0.3f, 0.3f, 0.3f, 0.3f), // emission
                10f);                               // shininess
            //droneObj.EulerDegAngleOrient(-40.0f,0.0f);
            testObj.Pos  = new OpenTK.Vector3(0f, 0f, -15f);
            testObj.Size = 100.0f;
            testObj.Name = "test object";
        }
Beispiel #8
0
        /// <summary>
        /// This method is used to load information stored in .mtl files referenced by the .obj file.
        /// </summary>
        /// <param name="d3ddevice"></param>
        /// <param name="file"></param>

        private void parseOBJ(string basePath, string filename)
        {
            MaterialInfoWithFaces currentMaterial = null;

            StreamReader sr = SSAssetManager.OpenStreamReader(Path.Combine(basePath, filename));

            //Read the first line of text
            string line = sr.ReadLine();

            //Continue to read until you reach end of file
            while (line != null)
            {
                // handle line continuation with "\"
                if (line.Length > 0)
                {
                    while (line[line.Length - 1] == '\\')
                    {
                        line = line.Substring(0, line.Length - 1); // remove line extender..
                        var nextline = sr.ReadLine();
                        if (nextline != null && nextline.Length != 0)
                        {
                            line = line + nextline; // merge with next line
                        }
                        else
                        {
                            break; // be sure to avoid infinite loop...
                        }
                    }
                }

                // split the line into tokens, separated by space
                string[] tokens = line.Split(" ".ToArray(), 2);
                if (tokens.Length < 2)
                {
                    goto next_line;
                }

                string firstToken  = tokens[0];
                string lineContent = tokens[1];

                switch (firstToken)
                {
                /* unsupported features - fatal */
                case "cstype":        // curved surface type (bmatrix, bezier, bspline, cardinal, taylor)
                case "deg":           // curve attr: degree
                case "step":          // curve attr: step size
                case "bmat":          // curve attr: basis matrix
                case "surf":          // surface
                case "parm":          // curve body: paramater value
                case "trim":          // curve body: outer trimming loop
                case "hole":          // curve body: inner trimming loop
                case "scrv":          // curve body: special curve
                case "sp":            // curve body: special point
                case "end":           // curve body: end
                case "con":           // connection between free form surfaces
                case "vp":            // paramater space vertex (for free form surfaces)

                case "bevel":         // bevel interpolation
                case "c_interp":      // color interpolation
                case "d_interp":      // dissolve interpolation
                case "lod":           // level of detail
                case "ctech":         // Curve approximation technique
                case "stech":         // Surface approximation technique
                case "mg":            // merging group (for free form surfaces)

                    throw new WavefrontObjParseException("WavefrontObjLoader.cs: fatal error, token not supported :  " + firstToken);

                /* unsupported features - warning */
                case "o":             // object name
                case "g":             // group name
                case "s":             // smoothing group
                case "shadow_obj":    // shadow casting
                case "trace_obj":     // ray tracing
                    Console.WriteLine("WavefrontObjLoader.cs: warning - unsupported wavefront token : " + firstToken);
                    break;

                /* supported features */
                case "#":       // Nothing to read, these are comments.
                    break;

                case "v":       // Vertex position
                    positions.Add(WavefrontParser.readVector4(lineContent, null));
                    break;

                case "vn":      // vertex normal direction vector
                    normals.Add(WavefrontParser.readVector3(lineContent, null));
                    break;

                case "vt":      // Vertex texcoordinate
                    texCoords.Add(WavefrontParser.readVector2(lineContent, null));
                    break;

                case "f":       // Face
                    string[] values    = WavefrontParser.FilteredSplit(lineContent, null);
                    int      numPoints = values.Length;

                    Face face = new Face();
                    face.v_idx   = new Int16[numPoints];
                    face.n_idx   = new Int16[numPoints];
                    face.tex_idx = new Int16[numPoints];      // todo: how do outside clients know if there were texcoords or not?!?!

                    for (int i = 0; i < numPoints; i++)
                    {
                        // format is "loc_index[/tex_index[/normal_index]]"  e.g. 3 ; 3/2 ; 3/2/5
                        // but middle part can me empty, e.g. 3//5
                        string[] indexes = values[i].Split('/');

                        int iPosition = (int.Parse(indexes[0]) - 1);      // adjust 1-based index
                        if (iPosition < 0)
                        {
                            iPosition += positions.Count + 1;
                        }                                                            // adjust negative indicies
                        face.v_idx[i] = (Int16)iPosition;
                        numIndices++;

                        // initialize other indicies to not provided, in case they are missing
                        face.n_idx[i]   = -1;
                        face.tex_idx[i] = -1;

                        if (indexes.Length > 1)
                        {
                            string tex_index = indexes[1];
                            if (tex_index != "")
                            {
                                int iTexCoord = int.Parse(tex_index) - 1;     // adjust 1-based index
                                if (iTexCoord < 0)
                                {
                                    iTexCoord += texCoords.Count + 1;
                                }                                                             // adjust negative indicies

                                face.tex_idx[i] = (Int16)iTexCoord;
                            }

                            if (indexes.Length > 2)
                            {
                                hasNormals = true;
                                int iNormal = int.Parse(indexes[2]) - 1;     // adjust 1 based index
                                if (iNormal < 0)
                                {
                                    iNormal += normals.Count + 1;
                                }                                                      // adjust negative indicies

                                face.n_idx[i] = (Int16)iNormal;
                            }
                        }
                    }
                    if (currentMaterial == null)
                    {
                        // no material in file, so create one
                        currentMaterial = createImplicitMaterial();
                    }
                    currentMaterial.faces.Add(face);
                    currentMaterial.nbrIndices += face.v_idx.Length;
                    numFaces++;
                    break;

                case "mtllib":      // load named material file
                    string mtlFile = lineContent;
                    {
                        var mtls = SSWavefrontMTLInfo.ReadMTLs(Path.Combine(basePath, mtlFile));
                        foreach (var mtl in mtls)
                        {
                            materials.Add(new MaterialInfoWithFaces(mtl));
                        }
                    }
                    break;

                case "usemtl":      // use named material (from material file previously loaded)
                    bool found = false;

                    string matName = lineContent;

                    for (int i = 0; i < materials.Count; i++)
                    {
                        if (matName.Equals(materials[i].mtl.name))
                        {
                            found           = true;
                            currentMaterial = materials[i];
                        }
                    }

                    if (!found)
                    {
                        throw new WavefrontObjParseException("Materials are already loaded so we should have it!");
                    }
                    break;
                }

next_line:
                //Read the next line
                line = sr.ReadLine();
            }

            //close the file
            sr.Close();


            // debug print loaded stats
            Console.WriteLine("WavefrontObjLoader.cs: file processed...");
            Console.WriteLine("   vertex positions: {0}", positions.Count);
            Console.WriteLine("   vertex   normals: {0}", normals.Count);
            Console.WriteLine("   vertex texCoords: {0}", texCoords.Count);
            foreach (var mtl in materials)
            {
                Console.WriteLine(
                    "           Material:      faces: {1}  indicies: {2}  ({0})", mtl.mtl.name, mtl.faces.Count, mtl.nbrIndices);
                Console.WriteLine(
                    "                       diff Tex: {0}", mtl.mtl.diffuseTextureResourceName);
            }
            Console.WriteLine("WavefrontObjLoader.cs: end.");
        }
 public static SSTexture getDefaultTexture()
 {
     return(SSAssetManager.GetInstance <SSTextureWithAlpha> ("explosions/fig7.png"));
     //return SSAssetManager.GetInstance<SSTextureWithAlpha> ("explosions/fig7_debug.png");
 }
Beispiel #10
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
        }
Beispiel #11
0
        protected override void setupScene()
        {
            base.setupScene();

            var droneMesh = SSAssetManager.GetInstance <SSMesh_wfOBJ> ("./drone2/Drone2.obj");
            //var droneMesh = SSAssetManager.GetInstance<SSMesh_wfOBJ> ("missiles", "missile.obj");
            var vandalMesh = SSAssetManager.GetInstance <SSMesh_wfOBJ> ("missiles/vandal_assembled.obj");

            // add drones
            attackerDrone     = new SSObjectMesh(droneMesh);
            attackerDrone.Pos = new OpenTK.Vector3(-20f, 0f, 0f);
            attackerDrone.Orient(Vector3.UnitX, Vector3.UnitY);
            attackerDrone.AmbientMatColor  = new Color4(0.1f, 0.1f, 0.1f, 0.1f);
            attackerDrone.DiffuseMatColor  = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            attackerDrone.SpecularMatColor = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            attackerDrone.EmissionMatColor = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            attackerDrone.Name             = "attacker drone";
            main3dScene.AddObject(attackerDrone);

            targetDrone     = new SSObjectMesh(droneMesh);
            targetDrone.Pos = new OpenTK.Vector3(200f, 0f, 0f);
            targetDrone.Orient(-Vector3.UnitX, Vector3.UnitY);
            targetDrone.AmbientMatColor  = new Color4(0.1f, 0.1f, 0.1f, 0.1f);
            targetDrone.DiffuseMatColor  = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            targetDrone.SpecularMatColor = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            targetDrone.EmissionMatColor = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            targetDrone.Name             = "target drone";
            targetDrone.MainColor        = new Color4(1f, 0f, 0.7f, 1f);
            main3dScene.AddObject(targetDrone);

            vandalShip                  = new SSObjectMesh(vandalMesh);
            vandalShip.Pos              = new OpenTK.Vector3(100f, 0f, 0f);
            vandalShip.Scale            = new Vector3(0.05f);
            vandalShip.AmbientMatColor  = new Color4(0.1f, 0.1f, 0.1f, 0.1f);
            vandalShip.DiffuseMatColor  = new Color4(0.1f, 0.1f, 0.1f, 0.1f);
            vandalShip.SpecularMatColor = new Color4(0.1f, 0.1f, 0.1f, 0.1f);
            vandalShip.EmissionMatColor = new Color4(0.0f, 0.0f, 0.0f, 0.0f);
            vandalShip.Name             = "Vandal ship";
            vandalShip.MainColor        = new Color4(0.6f, 0.6f, 0.6f, 1f);
            //vandalShip.MainColor = new Color4(1f, 0f, 0.7f, 1f);
            //droneObj2.renderState.visible = false;
            vandalShip.Orient((targetDrone.Pos - vandalShip.Pos).Normalized(), Vector3.UnitY);
            main3dScene.AddObject(vandalShip);

            // shows explosions
            explosionManager = new SExplosionRenderManager();
            explosionManager.particleSystem.doShockwave = false;
            explosionManager.particleSystem.doDebris    = false;
            explosionManager.particleSystem.timeScale   = 3f;
            //explosionManager.renderState.visible = false;
            alpha3dScene.AddObject(explosionManager);

            // attacker drone missile parameters
            attackerDroneFieldGen = new BodiesFieldGenerator(
                new ParticlesSphereGenerator(Vector3.Zero, 1f));
            attackerDroneMissileParams = new SSpaceMissileVisualParameters();

            // vandal missile params
            vandalShipFieldGen = new BodiesRingGenerator(
                new ParticlesOvalGenerator(1f, 1f),
                ringCenter: new Vector3(0f, 0f, 0f),
                up: Vector3.UnitZ,
                ringRadius: 80f,
                oriPolicy: BodiesFieldGenerator.OrientPolicy.None
                );

            vandalShipMissileParams = new SSpaceMissileVisualParameters();
            vandalShipMissileParams.ejectionMaxRotationVel = 0.05f;
            vandalShipMissileParams.ejectionVelocity       = 30f;
            vandalShipMissileParams.pursuitActivationTime  = 0.1f;
            vandalShipMissileParams.ejectionSmokeDuration  = 0.5f;
            vandalShipMissileParams.ejectionSmokeSizeMax   = 5f;

            cameraMissileParams = new SSpaceMissileVisualParameters();
            //cameraMissileParams.spawnGenerator = null;
            //cameraMissileParams.spawnTxfm = straightMissileSpawnTxfm;
            cameraMissileParams.ejectionMaxRotationVel = 0.05f;
            cameraMissileParams.ejectionVelocity       = 10f;

            // missile manager
            missileManager = new SSpaceMissilesRenderManager(main3dScene, alpha3dScene, hud2dScene);

            // additional statistics text
            missileStatsText = new SSObjectGDISurface_Text();
            missileStatsText.alphaBlendingEnabled = true;
            missileStatsText.Label = "stats placeholder...";
            missileStatsText.Pos   = new Vector3(100f, 100f, 0f);
            //missileStatsText.Size = 20f;
            hud2dScene.AddObject(missileStatsText);

            var targetsManager = new SHudTargetsManager(main3dScene, hud2dScene);

            targetHud = targetsManager.addTarget(
                (o) => Color4.Red,
                _showDistanceFunc,
                (o) => o != null ? o.Name : "none",
                getTargetObject()
                );
        }
Beispiel #12
0
 private SSMD5MeshParser(SSAssetManager.Context ctx, string filename)
     : base(ctx, filename)
 {
 }
Beispiel #13
0
 public SSTexture middleBackgroundTexture()
 {
     return(SSAssetManager.GetInstance <SSTextureWithAlpha>(middleBackgroundTextureFilename));
 }
Beispiel #14
0
        protected override void setupScene()
        {
            base.setupScene();

            var mesh = SSAssetManager.GetInstance <SSMesh_wfOBJ> ("./drone2/", "Drone2.obj");

            // add drone
            SSObject droneObj = new SSObjectMesh(mesh);

            scene.AddObject(droneObj);
            droneObj.renderState.lighted = true;
            droneObj.AmbientMatColor     = new Color4(0.1f, 0.1f, 0.1f, 0.1f);
            droneObj.DiffuseMatColor     = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            droneObj.SpecularMatColor    = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            droneObj.EmissionMatColor    = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            droneObj.ShininessMatColor   = 10.0f;
            //droneObj.EulerDegAngleOrient(-40.0f,0.0f);
            droneObj.Pos  = new OpenTK.Vector3(0, 0, -15f);
            droneObj.Name = "drone 1";

            // add second drone

            SSObject drone2Obj = new SSObjectMesh(
                SSAssetManager.GetInstance <SSMesh_wfOBJ>("./drone2/", "Drone2.obj")
                );

            scene.AddObject(drone2Obj);
            drone2Obj.renderState.lighted = true;
            drone2Obj.AmbientMatColor     = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            drone2Obj.DiffuseMatColor     = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            droneObj.SpecularMatColor     = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            drone2Obj.EmissionMatColor    = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            drone2Obj.ShininessMatColor   = 10.0f;
            drone2Obj.EulerDegAngleOrient(-40f, 0f);
            drone2Obj.Pos  = new OpenTK.Vector3(0f, 0f, 0f);
            drone2Obj.Name = "drone 2";

            // setup a sun billboard object and a sun flare spriter renderer
            {
                var sunDisk      = new SSMeshDisk();
                var sunBillboard = new SSObjectBillboard(sunDisk, true);
                sunBillboard.MainColor = new Color4(1f, 1f, 0.8f, 1f);
                sunBillboard.Pos       = new Vector3(0f, 0f, 18000f);
                sunBillboard.Scale     = new Vector3(600f);
                sunBillboard.renderState.frustumCulling = false;
                sunBillboard.renderState.lighted        = false;
                sunBillboard.renderState.castsShadow    = false;
                sunDiskScene.AddObject(sunBillboard);

                SSTexture    flareTex         = SSAssetManager.GetInstance <SSTextureWithAlpha>(".", "sun_flare.png");
                const float  bigOffset        = 0.8889f;
                const float  smallOffset      = 0.125f;
                RectangleF[] flareSpriteRects =
                {
                    new RectangleF(0f,                      0f,          1f, bigOffset),
                    new RectangleF(0f,               bigOffset, smallOffset, smallOffset),
                    new RectangleF(smallOffset,      bigOffset, smallOffset, smallOffset),
                    new RectangleF(smallOffset * 2f, bigOffset, smallOffset, smallOffset),
                    new RectangleF(smallOffset * 3f, bigOffset, smallOffset, smallOffset),
                };
                float[] spriteScales = { 20f, 1f, 2f, 1f, 1f };
                var     sunFlare     = new SimpleSunFlareMesh(sunDiskScene, sunBillboard, flareTex,
                                                              flareSpriteRects, spriteScales);
                sunFlare.Scale = new Vector3(2f);
                sunFlare.renderState.lighted = false;
                sunFlareScene.AddObject(sunFlare);
            }

            // instanced asteroid ring
            //if (false)
            {
                var roidmesh = SSAssetManager.GetInstance <SSMesh_wfOBJ> ("simpleasteroid", "asteroid.obj");
                var ringGen  = new BodiesRingGenerator(
                    120f, 50f,
                    Vector3.Zero, Vector3.UnitY, 250f,
                    0f, (float)Math.PI * 2f,
                    1f, 3f, 1f, 0.5f
                    //10f, 30f, 1f, 20f
                    );

                var ringEmitter = new SSBodiesFieldEmitter(ringGen);
                ringEmitter.particlesPerEmission = 10000;
                //ringEmitter.ParticlesPerEmission = 10;

                var ps = new SSParticleSystem(10000);
                ps.addEmitter(ringEmitter);
                Console.WriteLine("Packing 10k asteroids into a ring. This may take a second...");
                ps.emitAll();
                asteroidRingRenderer = new SSInstancedMeshRenderer(ps, roidmesh, BufferUsageHint.StaticDraw);
                asteroidRingRenderer.simulateOnUpdate            = false;
                asteroidRingRenderer.depthRead                   = true;
                asteroidRingRenderer.depthWrite                  = true;
                asteroidRingRenderer.Name                        = "instanced asteroid renderer";
                asteroidRingRenderer.renderState.castsShadow     = true;
                asteroidRingRenderer.renderState.receivesShadows = true;
                scene.AddObject(asteroidRingRenderer);
            }

            // particle system test
            // particle systems should be drawn last (if it requires alpha blending)
            //if (false)
            {
                // setup an emitter
                var box     = new ParticlesSphereGenerator(new Vector3(0f, 0f, 0f), 10f);
                var emitter = new SSParticlesFieldEmitter(box);
                //emitter.EmissionDelay = 5f;
                emitter.particlesPerEmission = 1;
                emitter.emissionInterval     = 0.5f;
                emitter.life = 1000f;
                emitter.colorOffsetComponentMin = new Color4(0.5f, 0.5f, 0.5f, 1f);
                emitter.colorOffsetComponentMax = new Color4(1f, 1f, 1f, 1f);
                emitter.velocityComponentMax    = new Vector3(.3f);
                emitter.velocityComponentMin    = new Vector3(-.3f);
                emitter.angularVelocityMin      = new Vector3(-0.5f);
                emitter.angularVelocityMax      = new Vector3(0.5f);
                emitter.dragMin = 0f;
                emitter.dragMax = .1f;
                RectangleF[] uvRects    = new RectangleF[18 * 6];
                float        tileWidth  = 1f / 18f;
                float        tileHeight = 1f / 6f;
                for (int r = 0; r < 6; ++r)
                {
                    for (int c = 0; c < 18; ++c)
                    {
                        uvRects [r * 18 + c] = new RectangleF(tileWidth * (float)r,
                                                              tileHeight * (float)c,
                                                              tileWidth,
                                                              tileHeight);
                    }
                }
                emitter.spriteRectangles = uvRects;

                var periodicExplosiveForce = new SSPeriodicExplosiveForceEffector();
                periodicExplosiveForce.effectInterval    = 3f;
                periodicExplosiveForce.explosiveForceMin = 1000f;
                periodicExplosiveForce.explosiveForceMax = 5000f;
                periodicExplosiveForce.effectDelay       = 5f;
                periodicExplosiveForce.centerMin         = new Vector3(-30f, -30f, -30f);
                periodicExplosiveForce.centerMax         = new Vector3(30f, 30f, 30f);
                //periodicExplosiveForce.Center = new Vector3 (10f);

                // make a particle system
                SSParticleSystem cubesPs = new SSParticleSystem(1000);
                cubesPs.addEmitter(emitter);
                cubesPs.addEffector(periodicExplosiveForce);

                // test a renderer
                var tex           = SSAssetManager.GetInstance <SSTextureWithAlpha>(".", "elements.png");
                var cubesRenderer = new SSInstancedMeshRenderer(cubesPs, SSTexturedNormalCube.Instance);
                cubesRenderer.Pos = new Vector3(0f, 0f, -30f);
                cubesRenderer.alphaBlendingEnabled = false;
                cubesRenderer.depthRead            = true;
                cubesRenderer.depthWrite           = true;
                cubesRenderer.Name = "cube particle renderer";
                cubesRenderer.renderState.castsShadow     = true;
                cubesRenderer.renderState.receivesShadows = true;
                cubesRenderer.textureMaterial             = new SSTextureMaterial(null, null, tex, null);
                scene.AddObject(cubesRenderer);
                //cubesRenderer.renderState.visible = false;

                // test explositons
                //if (false)
                {
                    SimpleExplosionRenderer aer = new SimpleExplosionRenderer(100);
                    aer.Pos = cubesRenderer.Pos;
                    scene.AddObject(aer);

                    periodicExplosiveForce.explosionEventHandlers += (pos, force) => {
                        aer.showExplosion(pos, force / periodicExplosiveForce.explosiveForceMin * 1.5f);
                    };
                }
            }
        }
 public static SSTexture defaultTexture()
 {
     return(SSAssetManager.GetInstance <SSTextureWithAlpha>(".", "sun_flare.png"));
     //return SSAssetManager.GetInstance<SSTextureWithAlpha>(".", "sun_flare_debug.png");
     //return SSAssetManager.GetInstance<SSTextureWithAlpha>(".", "uv_checker large.png"))
 }
 public SSTexture smokeParticlesTexture()
 {
     return(SSAssetManager.GetInstance <SSTextureWithAlpha>(smokeParticlesTextureFilename));
 }
Beispiel #17
0
        public void setupScene()
        {
            scene.BaseShader          = shaderPgm;
            scene.FrustumCulling      = true;         // TODO: fix the frustum math, since it seems to be broken.
            scene.BeforeRenderObject += (obj, renderConfig) => {
                shaderPgm.Activate();
                if (obj == selectedObject)
                {
                    renderConfig.drawWireframeMode = WireframeMode.GLSL_SinglePass;
                    shaderPgm.u_ShowWireframes     = true;
                }
                else
                {
                    renderConfig.drawWireframeMode = WireframeMode.None;
                    shaderPgm.u_ShowWireframes     = false;
                }
            };


            var lightPos = new Vector3(5.0f, 40.0f, 10.0f);
            // 0. Add Lights
            var light = new SSLight();

            light.Pos = lightPos;
            scene.AddLight(light);

            // 1. Add Objects
            SSObject triObj;

            scene.AddObject(triObj = new SSObjectTriangle());
            triObj.Pos             = lightPos;

            var mesh = SSAssetManager.GetInstance <SSMesh_wfOBJ> ("./drone2/", "Drone2.obj");

            // add drone
            SSObject droneObj = new SSObjectMesh(mesh);

            scene.AddObject(this.activeModel = droneObj);
            droneObj.renderState.lighted     = true;
            droneObj.ambientMatColor         = new Color4(0.2f, 0.2f, 0.2f, 0.2f);
            droneObj.diffuseMatColor         = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            droneObj.specularMatColor        = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            droneObj.emissionMatColor        = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            droneObj.shininessMatColor       = 10.0f;
            droneObj.EulerDegAngleOrient(-40.0f, 0.0f);
            droneObj.Pos  = new OpenTK.Vector3(-5, 0, 0);
            droneObj.Name = "drone 1";

            // add second drone

            SSObject drone2Obj = new SSObjectMesh(
                SSAssetManager.GetInstance <SSMesh_wfOBJ>("./drone2/", "Drone2.obj")
                );

            scene.AddObject(drone2Obj);
            drone2Obj.renderState.lighted = true;
            drone2Obj.ambientMatColor     = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            drone2Obj.diffuseMatColor     = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            droneObj.specularMatColor     = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            drone2Obj.emissionMatColor    = new Color4(0.3f, 0.3f, 0.3f, 0.3f);
            drone2Obj.shininessMatColor   = 10.0f;
            drone2Obj.Pos = new OpenTK.Vector3(20, 0, 0);
            drone2Obj.EulerDegAngleOrient(20.0f, 0.0f);
            drone2Obj.Name = "drone 2";

            // last. Add Camera

            scene.AddObject(scene.ActiveCamera =
                                new SSCameraThirdPerson(droneObj));
        }
 public SSAbstractMesh missileBodyMesh()
 {
     return(SSAssetManager.GetInstance <SSMesh_wfOBJ>(missileBodyMeshFilename));
 }
Beispiel #19
0
        protected virtual void setupScene()
        {
            scene            = new SSScene(mainShader, pssmShader, instancingShader, instancingPssmShader);
            sunDiskScene     = new SSScene();
            sunFlareScene    = new SSScene();
            hudScene         = new SSScene();
            environmentScene = new SSScene();

            scene.renderConfig.frustumCulling = true;              // TODO: fix the frustum math, since it seems to be broken.
            scene.BeforeRenderObject         += beforeRenderObjectHandler;

            // 0. Add Lights
            var light = new SSDirectionalLight(LightName.Light0);

            light.Direction = new Vector3(0f, 0f, -1f);
                        #if true
            if (OpenTKHelper.areFramebuffersSupported())
            {
                if (scene.renderConfig.pssmShader != null && scene.renderConfig.instancePssmShader != null)
                {
                    light.ShadowMap = new SSParallelSplitShadowMap(TextureUnit.Texture7);
                }
                else
                {
                    light.ShadowMap = new SSSimpleShadowMap(TextureUnit.Texture7);
                }
            }
            if (!light.ShadowMap.IsValid)
            {
                light.ShadowMap = null;
            }
                        #endif
            scene.AddLight(light);

                        #if true
            var smapDebug = new SSObjectHUDQuad(light.ShadowMap.TextureID);
            smapDebug.Scale = new Vector3(0.3f);
            smapDebug.Pos   = new Vector3(50f, 200, 0f);
            hudScene.AddObject(smapDebug);
                        #endif

            // setup a sun billboard object and a sun flare spriter renderer
            {
                var sunDisk      = new SSMeshDisk();
                var sunBillboard = new SSObjectBillboard(sunDisk, true);
                sunBillboard.MainColor = new Color4(1f, 1f, 0.8f, 1f);
                sunBillboard.Pos       = new Vector3(0f, 0f, 18000f);
                sunBillboard.Scale     = new Vector3(600f);
                sunBillboard.renderState.frustumCulling = false;
                sunBillboard.renderState.lighted        = false;
                sunBillboard.renderState.castsShadow    = false;
                sunDiskScene.AddObject(sunBillboard);

                SSTexture    flareTex         = SSAssetManager.GetInstance <SSTextureWithAlpha>(".", "sun_flare.png");
                const float  bigOffset        = 0.8889f;
                const float  smallOffset      = 0.125f;
                RectangleF[] flareSpriteRects =
                {
                    new RectangleF(0f,                      0f,          1f, bigOffset),
                    new RectangleF(0f,               bigOffset, smallOffset, smallOffset),
                    new RectangleF(smallOffset,      bigOffset, smallOffset, smallOffset),
                    new RectangleF(smallOffset * 2f, bigOffset, smallOffset, smallOffset),
                    new RectangleF(smallOffset * 3f, bigOffset, smallOffset, smallOffset),
                };
                float[] spriteScales = { 20f, 1f, 2f, 1f, 1f };
                var     sunFlare     = new SimpleSunFlareMesh(sunDiskScene, sunBillboard, flareTex,
                                                              flareSpriteRects, spriteScales);
                sunFlare.Scale = new Vector3(2f);
                sunFlare.renderState.lighted = false;
                sunFlareScene.AddObject(sunFlare);
            }
        }
Beispiel #20
0
 public SSTexture laserBurnParticlesTexture()
 {
     return(SSAssetManager.GetInstance <SSTextureWithAlpha>(laserBurnParticlesFilename));
 }
Beispiel #21
0
 public SSTexture middleInterferenceTexture()
 {
     return(SSAssetManager.GetInstance <SSTextureWithAlpha> (middleInterferenceTextureFilename));
 }
Beispiel #22
0
 public SSTexture middleOverlayTexture()
 {
     return(SSAssetManager.GetInstance <SSTextureWithAlpha>(middleOverlayTextureFilename));
 }
Beispiel #23
0
        protected override void setupScene()
        {
            base.setupScene();

            var mesh = SSAssetManager.GetInstance <SSMesh_wfOBJ> ("./drone2/Drone2.obj");

            // add drone
            SSObject droneObj = new SSObjectMesh(mesh);

            main3dScene.AddObject(droneObj);
            droneObj.renderState.lighted = true;
            droneObj.colorMaterial       = new SSColorMaterial(
                new Color4(0.3f, 0.3f, 0.3f, 0.3f), // diffuse
                new Color4(0.1f, 0.1f, 0.1f, 0.1f), // ambient
                new Color4(0.3f, 0.3f, 0.3f, 0.3f), // specular
                new Color4(0.3f, 0.3f, 0.3f, 0.3f), // emission
                10f);                               // shininess
            //droneObj.EulerDegAngleOrient(-40.0f,0.0f);
            droneObj.Pos  = new OpenTK.Vector3(0f, 0f, -15f);
            droneObj.Name = "drone 1";

            // add second drone

            SSObject drone2Obj = new SSObjectMesh(
                SSAssetManager.GetInstance <SSMesh_wfOBJ>("./drone2/Drone2.obj")
                );

            main3dScene.AddObject(drone2Obj);
            drone2Obj.renderState.lighted = true;
            drone2Obj.colorMaterial       = new SSColorMaterial(
                new Color4(0.3f, 0.3f, 0.3f, 0.3f), // diffuse
                new Color4(0.3f, 0.3f, 0.3f, 0.3f), // ambient
                new Color4(0.3f, 0.3f, 0.3f, 0.3f), // specular
                new Color4(0.3f, 0.3f, 0.3f, 0.3f), // emission
                10f);                               // shininess
            drone2Obj.EulerDegAngleOrient(-40f, 0f);
            drone2Obj.Pos  = new OpenTK.Vector3(0f, 0f, 0f);
            drone2Obj.Name = "drone 2";

            // instanced asteroid ring
            //if (false)
            {
                var roidmesh = SSAssetManager.GetInstance <SSMesh_wfOBJ> ("simpleasteroid/asteroid.obj");
                var ringGen  = new BodiesRingGenerator(
                    120f, 50f,
                    Vector3.Zero, Vector3.UnitY, 250f,
                    0f, (float)Math.PI * 2f,
                    1f, 3f, 1f, 0.5f
                    //10f, 30f, 1f, 20f
                    );

                var ringEmitter = new SSBodiesFieldEmitter(ringGen);
                ringEmitter.particlesPerEmission = 10000;
                //ringEmitter.ParticlesPerEmission = 10;

                var ps = new SSParticleSystemData(10000);
                ps.addEmitter(ringEmitter);
                Console.WriteLine("Packing 10k asteroids into a ring. This may take a second...");
                ps.emitAll();
                asteroidRingRenderer = new SSInstancedMeshRenderer(ps, roidmesh, BufferUsageHint.StaticDraw);
                asteroidRingRenderer.simulateOnUpdate            = false;
                asteroidRingRenderer.Name                        = "instanced asteroid renderer";
                asteroidRingRenderer.renderState.castsShadow     = true;
                asteroidRingRenderer.renderState.receivesShadows = true;
                asteroidRingRenderer.selectable                  = true;
                asteroidRingRenderer.useBVHForIntersections      = true;
                main3dScene.AddObject(asteroidRingRenderer);
            }

            // particle system test
            // particle systems should be drawn last (if it requires alpha blending)
            //if (false)
            {
                // setup an emitter
                var box     = new ParticlesSphereGenerator(new Vector3(0f, 0f, 0f), 10f);
                var emitter = new SSParticlesFieldEmitter(box);
                //emitter.EmissionDelay = 5f;
                emitter.particlesPerEmission = 1;
                emitter.emissionInterval     = 0.5f;
                emitter.life = 1000f;
                emitter.colorOffsetComponentMin = new Color4(0.5f, 0.5f, 0.5f, 1f);
                emitter.colorOffsetComponentMax = new Color4(1f, 1f, 1f, 1f);
                emitter.velocityComponentMax    = new Vector3(.3f);
                emitter.velocityComponentMin    = new Vector3(-.3f);
                emitter.angularVelocityMin      = new Vector3(-0.5f);
                emitter.angularVelocityMax      = new Vector3(0.5f);
                emitter.dragMin = 0f;
                emitter.dragMax = .1f;
                RectangleF[] uvRects    = new RectangleF[18 * 6];
                float        tileWidth  = 1f / 18f;
                float        tileHeight = 1f / 6f;
                for (int r = 0; r < 6; ++r)
                {
                    for (int c = 0; c < 18; ++c)
                    {
                        uvRects [r * 18 + c] = new RectangleF(tileWidth * (float)r,
                                                              tileHeight * (float)c,
                                                              tileWidth,
                                                              tileHeight);
                    }
                }
                emitter.spriteRectangles = uvRects;

                var periodicExplosiveForce = new SSPeriodicExplosiveForceEffector();
                periodicExplosiveForce.effectInterval    = 3f;
                periodicExplosiveForce.explosiveForceMin = 1000f;
                periodicExplosiveForce.explosiveForceMax = 5000f;
                periodicExplosiveForce.effectDelay       = 5f;
                periodicExplosiveForce.centerMin         = new Vector3(-30f, -30f, -30f);
                periodicExplosiveForce.centerMax         = new Vector3(+30f, +30f, +30f);
                //periodicExplosiveForce.Center = new Vector3 (10f);

                // make a particle system
                SSParticleSystemData cubesPs = new SSParticleSystemData(1000);
                cubesPs.addEmitter(emitter);
                cubesPs.addEffector(periodicExplosiveForce);

                // test a renderer
                var tex           = SSAssetManager.GetInstance <SSTextureWithAlpha>("elements.png");
                var cubesRenderer = new SSInstancedMeshRenderer(cubesPs, SSTexturedNormalCube.Instance);
                cubesRenderer.Pos = new Vector3(0f, 0f, -30f);
                cubesRenderer.alphaBlendingEnabled = false;
                cubesRenderer.Name = "cube particle renderer";
                cubesRenderer.renderState.castsShadow     = true;
                cubesRenderer.renderState.receivesShadows = true;
                cubesRenderer.textureMaterial             = new SSTextureMaterial(null, null, tex, null);
                cubesRenderer.selectable = true;
                main3dScene.AddObject(cubesRenderer);
                //cubesRenderer.renderState.visible = false;

                // test explositons
                //if (false)
                {
                    SExplosionRenderer aer = new SExplosionRenderer(100);
                    aer.Pos = cubesRenderer.Pos;
                    alpha3dScene.AddObject(aer);

                    periodicExplosiveForce.explosionEventHandlers += (pos, force) => {
                        aer.showExplosion(pos, force / periodicExplosiveForce.explosiveForceMin * 1.5f);
                    };
                }
            }
        }
Beispiel #24
0
        /// <summary>Creates a 800x600 window with the specified title.</summary>
        public TestBenchBootstrap(string windowName)
            : base(
                                #if false
                800, 600,
                GraphicsMode.Default,    // color format
                windowName,
                GameWindowFlags.Default, // windowed mode
                DisplayDevice.Default,   // primary monitor
                2, 2,                    // opengl version
                GraphicsContextFlags.Debug
                                #endif
                )
        {
            // this can be used to force other culture settings for testing..
            // System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("nl-NL");

            this.Title = windowName;
            VSync      = VSyncMode.On;
            restoreClientWindowLocation();

            Console.WriteLine("GL Version = {0}", GL.GetString(StringName.Version));
            Console.WriteLine("GL Shader Version = {0}", GL.GetString(StringName.ShadingLanguageVersion));

            // setup asset manager contexts
            // these help the asset manager find the "Asset" directy up above the bin/obj/Debug
            // output directories...
            SSAssetManager.AddAssetArchive(new SSAssetArchiveHandler_FileSystem("./Assets"));
            SSAssetManager.AddAssetArchive(new SSAssetArchiveHandler_FileSystem("../../Assets"));
            SSAssetManager.AddAssetArchive(new SSAssetArchiveHandler_FileSystem("../../../Assets"));
            SSAssetManager.AddAssetArchive(new SSAssetArchiveHandler_FileSystem("../../../../Assets"));

            mainShader = new SSMainShaderProgram();             // before mscene
            if (!mainShader.IsValid)
            {
                throw new Exception("Failed to build the main shader");
            }
            pssmShader = new SSPssmShaderProgram();
            if (!pssmShader.IsValid)
            {
                pssmShader = null;
            }
            instancingShader = new SSInstanceShaderProgram();
            if (!instancingShader.IsValid)
            {
                instancingShader = null;
            }
            else
            {
                instancingShader.debugLocations();
            }
            instancingPssmShader = new SSInstancePssmShaderProgram();
            if (!instancingPssmShader.IsValid)
            {
                instancingPssmShader = null;
            }

            setupInput();
            setupScene();
            setupCamera();
            setupEnvironment();
            setupHUD();
        }
 public SSTexture getTexture()
 {
     return(SSAssetManager.GetInstance <SSTextureWithAlpha> (textureFilename));
 }
Beispiel #26
0
        /// <summary>
        /// This method is used to load information stored in .mtl files referenced by the .obj file.
        /// </summary>
        /// <param name="d3ddevice"></param>
        /// <param name="file"></param>

        private void parseOBJ(string basePath, string filename)
        {
            MaterialInfoWithFaces currentMaterial = null;

            StreamReader sr = SSAssetManager.OpenStreamReader(Path.Combine(basePath, filename));

            //Read the first line of text
            string line = sr.ReadLine();

            //Continue to read until you reach end of file
            while (line != null)
            {
                string[] tokens = line.Split(" ".ToArray(), 2);
                if (tokens.Length < 2)
                {
                    goto next_line;
                }

                string firstToken  = tokens[0];
                string lineContent = tokens[1];

                switch (firstToken)
                {
                case "#":       // Nothing to read, these are comments.
                    break;

                case "v":       // Vertex position
                    positions.Add(WavefrontParser.readVector4(lineContent, null));
                    break;

                case "vn":      // vertex normal direction vector
                    normals.Add(WavefrontParser.readVector3(lineContent, null));
                    break;

                case "vt":      // Vertex texcoordinate
                    texCoords.Add(WavefrontParser.readVector2(lineContent, null));
                    break;

                case "f":       // Face
                    string[] values    = WavefrontParser.FilteredSplit(lineContent, null);
                    int      numPoints = values.Length;

                    Face face = new Face();
                    face.v_idx   = new Int16[numPoints];
                    face.n_idx   = new Int16[numPoints];
                    face.tex_idx = new Int16[numPoints];      // todo: how do outside clients know if there were texcoords or not?!?!

                    for (int i = 0; i < numPoints; i++)
                    {
                        // format is "loc_index[/tex_index[/normal_index]]"  e.g. 3 ; 3/2 ; 3/2/5
                        // but middle part can me empty, e.g. 3//5
                        string[] indexes = values[i].Split('/');

                        int iPosition = (int.Parse(indexes[0]) - 1);      // adjust 1-based index
                        if (iPosition < 0)
                        {
                            iPosition += positions.Count + 1;
                        }                                                            // adjust negative indicies
                        face.v_idx[i] = (Int16)iPosition;
                        numIndices++;

                        // initialize other indicies to not provided, in case they are missing
                        face.n_idx[i]   = -1;
                        face.tex_idx[i] = -1;

                        if (indexes.Length > 1)
                        {
                            string tex_index = indexes[1];
                            if (tex_index != "")
                            {
                                int iTexCoord = int.Parse(tex_index) - 1;     // adjust 1-based index
                                if (iTexCoord < 0)
                                {
                                    iTexCoord += texCoords.Count + 1;
                                }                                                             // adjust negative indicies

                                face.tex_idx[i] = (Int16)iTexCoord;
                            }

                            if (indexes.Length > 2)
                            {
                                hasNormals = true;
                                int iNormal = int.Parse(indexes[2]) - 1;     // adjust 1 based index
                                if (iNormal < 0)
                                {
                                    iNormal += normals.Count + 1;
                                }                                                      // adjust negative indicies

                                face.n_idx[i] = (Int16)iNormal;
                            }
                        }
                    }
                    if (currentMaterial == null)
                    {
                        // no material in file, so create one
                        currentMaterial = createImplicitMaterial();
                    }
                    currentMaterial.faces.Add(face);
                    currentMaterial.nbrIndices += face.v_idx.Length;
                    numFaces++;
                    break;

                case "mtllib":      // load named material file
                    string mtlFile = lineContent;
                    {
                        var mtls = SSWavefrontMTLInfo.ReadMTLs(Path.Combine(basePath, mtlFile));
                        foreach (var mtl in mtls)
                        {
                            materials.Add(new MaterialInfoWithFaces(mtl));
                        }
                    }
                    break;

                case "usemtl":      // use named material (from material file previously loaded)
                    bool found = false;

                    string matName = lineContent;

                    for (int i = 0; i < materials.Count; i++)
                    {
                        if (matName.Equals(materials[i].mtl.name))
                        {
                            found           = true;
                            currentMaterial = materials[i];
                        }
                    }

                    if (!found)
                    {
                        throw new WavefrontObjParseException("Materials are already loaded so we should have it!");
                    }
                    break;
                }

next_line:
                //Read the next line
                line = sr.ReadLine();
            }

            //close the file
            sr.Close();
        }
Beispiel #27
0
 public static SSSkeletalMeshMD5[] ReadMeshes(SSAssetManager.Context ctx, string filename)
 {
     var parser = new SSMD5MeshParser (ctx, filename);
     return parser.readMeshes ();
 }
Beispiel #28
0
 public SSTexture emissionSpritesTexture()
 {
     return(SSAssetManager.GetInstance <SSTextureWithAlpha>(emissionSpritesTextureFilename));
 }