コード例 #1
0
        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));
        }
コード例 #2
0
ファイル: Projections.cs プロジェクト: wpwen/SimpleScene
        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);
        }
コード例 #3
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));
        }