/// <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); } }
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; }
public static SSSkeletalAnimationMD5 ReadAnimation(SSAssetManager.Context ctx, string filename) { var parser = new SSMD5AnimParser(ctx, filename); var anim = parser.readAnimation (); anim.name = filename; return anim; }
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; } }
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"; }
/// <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"); }
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 }
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() ); }
private SSMD5MeshParser(SSAssetManager.Context ctx, string filename) : base(ctx, filename) { }
public SSTexture middleBackgroundTexture() { return(SSAssetManager.GetInstance <SSTextureWithAlpha>(middleBackgroundTextureFilename)); }
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)); }
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)); }
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); } }
public SSTexture laserBurnParticlesTexture() { return(SSAssetManager.GetInstance <SSTextureWithAlpha>(laserBurnParticlesFilename)); }
public SSTexture middleInterferenceTexture() { return(SSAssetManager.GetInstance <SSTextureWithAlpha> (middleInterferenceTextureFilename)); }
public SSTexture middleOverlayTexture() { return(SSAssetManager.GetInstance <SSTextureWithAlpha>(middleOverlayTextureFilename)); }
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); }; } } }
/// <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)); }
/// <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(); }
public static SSSkeletalMeshMD5[] ReadMeshes(SSAssetManager.Context ctx, string filename) { var parser = new SSMD5MeshParser (ctx, filename); return parser.readMeshes (); }
public SSTexture emissionSpritesTexture() { return(SSAssetManager.GetInstance <SSTextureWithAlpha>(emissionSpritesTextureFilename)); }