public void setupScene() { scene = new SSScene (); var lightPos = new Vector3 (5.0f, 40.0f, 10.0f); // 0. Add Lights var light = new SSLight (LightName.Light0); light.Pos = lightPos; scene.addLight(light); // 1. Add Objects SSObject triObj; scene.addObject (triObj = new SSObjectTriangle () ); triObj.Pos = lightPos; // add drone SSObject droneObj = new SSObjectMesh (new SSMesh_wfOBJ (SSAssetManager.mgr.getContext ("./drone2/"), "drone2.obj", true, shaderPgm)); 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.shininessMatColor = 10.0f; droneObj.MouseDeltaOrient(-40.0f,0.0f); droneObj.Pos = new OpenTK.Vector3(-5,0,0); // add second drone SSObject drone2Obj = new SSObjectMesh( new SSMesh_wfOBJ(SSAssetManager.mgr.getContext("./drone2/"), "drone2.obj", true, shaderPgm) ); 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); drone2Obj.shininessMatColor = 10.0f; drone2Obj.Pos = new OpenTK.Vector3(20,0,0); drone2Obj.MouseDeltaOrient(20.0f,0.0f); // last. Add Camera scene.addObject (scene.activeCamera = new SSCameraThirdPerson (droneObj)); }
public static void SimpleShadowmapProjection( List <SSObject> objects, SSLight light, FrustumCuller frustum, // can be null (disabled) SSCamera camera, out float width, out float height, out float nearZ, out float farZ, out Vector3 viewEye, out Vector3 viewTarget, out Vector3 viewUp) { if (light.Type != SSLight.LightType.Directional) { throw new NotSupportedException(); } // light-aligned unit vectors Vector3 lightZ = light.Direction.Normalized(); Vector3 lightX, lightY; OpenTKHelper.TwoPerpAxes(lightZ, out lightX, out lightY); // Step 1: light-direction aligned AABB of the visible objects Vector3 projBBMin = new Vector3(float.PositiveInfinity); Vector3 projBBMax = new Vector3(float.NegativeInfinity); foreach (var obj in objects) { if (obj.renderState.toBeDeleted || !obj.renderState.visible || !obj.renderState.castsShadow) { continue; } else if (frustum == null || (obj.boundingSphere != null && frustum.isSphereInsideFrustum(obj.Pos, obj.ScaledRadius))) { // determine AABB in light coordinates of the objects so far Vector3 lightAlignedPos = OpenTKHelper.ProjectCoord(obj.Pos, lightX, lightY, lightZ); Vector3 rad = new Vector3(obj.ScaledRadius); Vector3 localMin = lightAlignedPos - rad; Vector3 localMax = lightAlignedPos + rad; projBBMin = Vector3.ComponentMin(projBBMin, localMin); projBBMax = Vector3.ComponentMax(projBBMax, localMax); } } if (frustum != null) { // then we need to do a second pass, including shadow-casters that // are between the camera-frusum and the light // compute the camera's position in lightspace, because we need to // include everything "closer" that the midline of the camera frustum Vector3 lightAlignedCameraPos = OpenTKHelper.ProjectCoord(camera.Pos, lightX, lightY, lightZ); float minZTest = lightAlignedCameraPos.Z; // TODO what happens if all objects are exluded? // Step 2: Extend Z of AABB to cover objects "between" current AABB and the light foreach (var obj in objects) { if (obj.renderState.toBeDeleted || !obj.renderState.visible || !obj.renderState.castsShadow) { continue; } Vector3 lightAlignedPos = OpenTKHelper.ProjectCoord(obj.Pos, lightX, lightY, lightZ); Vector3 rad = new Vector3(obj.ScaledRadius); Vector3 localMin = lightAlignedPos - rad; Vector3 localMax = lightAlignedPos + rad; if (OpenTKHelper.RectsOverlap(projBBMin.Xy, projBBMax.Xy, localMin.Xy, localMax.Xy) && localMin.Z < minZTest) { projBBMin = Vector3.ComponentMin(projBBMin, localMin); projBBMax = Vector3.ComponentMax(projBBMax, localMax); } } } // Finish the projection matrix // Use center of AABB in regular coordinates to get the view matrix Vector3 centerAligned = (projBBMin + projBBMax) / 2f; viewTarget = centerAligned.X * lightX + centerAligned.Y * lightY + centerAligned.Z * lightZ; float farEnough = (centerAligned.Z - projBBMin.Z) + 1f; viewEye = viewTarget - farEnough * lightZ; viewUp = lightY; width = projBBMax.X - projBBMin.X; height = projBBMax.Y - projBBMin.Y; nearZ = 1f; farZ = 1f + (projBBMax.Z - projBBMin.Z); }
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)); }