Exemplo n.º 1
0
        public Vector3 GetFaceDirection(Vector3 cameraPosition, AAFace face)
        {
            Vector3 Direction = cameraPosition;

            switch (face)
            {
            case AAFace.XMinus:
                Direction.X -= 0.1f;
                break;

            case AAFace.XPlus:
                Direction.X += 0.1f;
                break;

            case AAFace.YMinus:
                Direction.Y -= 0.1f;
                Direction.X += 0.00001f;     // Include a small tilt to avoid a Gimbal Lock
                break;

            case AAFace.YPlus:
                Direction.Y += 0.1f;
                Direction.X += 0.00001f;
                break;

            case AAFace.ZMinus:
                Direction.Z -= 0.1f;
                break;

            case AAFace.ZPlus:
                Direction.Z += 0.1f;
                break;
            }
            return(Direction);
        }
Exemplo n.º 2
0
        void DrawHemiCubeTextures(AAFace radSourceFace, SatComponent radSource)
        {
            // Set camera position on radition source face
            Vector3 Position = radSource.GetFaceCenter(radSourceFace);
            // Get List of camera orientations
            List <AAFace> CameraDirections = HemiCube.GetFaceList(radSourceFace);

            for (int i = 0; i < CameraDirections.Count; i++)
            {
                // Orient camera
                Vector3 CameraPointingTarget = radSource.GetFaceDirection(Position, CameraDirections[i]);
                CamHemiCube.SetPositionTarget(Position, CameraPointingTarget, true);

                // Prepare rendertarget
                GraphicsDevice.SetRenderTarget(HemiCube.RTIndividual[i]);
                GraphicsDevice.Clear(Color.Black);

                // Render complete model without source
                if (Settings.f_DrawCompleteModel)
                {
                    Model.DrawCompleteModel(CamHemiCube, false, Color.White);
                }
                // Render only currently active radiation source (single face)
                else
                {
                    // Draw black bounding boxes for complete model
                    Model.DrawCompleteModel(CamHemiCube, true, Color.Black);
                    // Draw single bounding box face
                    //Model.Components[RadTargetIdx].DrawBoundingBoxFace(CamHemiCube, radTargetFace, Color.White);
                    Model.Components[RadTargetIdx].DrawMesh(CamHemiCube, Color.White);
                }
            }
        }
Exemplo n.º 3
0
        public Vector3 GetFaceCenter(AAFace face)
        {
            Vector3 Center = GetBoundingBoxCenter();

            switch (face)
            {
            case AAFace.XMinus:
                Center.X -= DimX / 2;
                break;

            case AAFace.XPlus:
                Center.X += DimX / 2;
                break;

            case AAFace.YMinus:
                Center.Y -= DimY / 2;
                break;

            case AAFace.YPlus:
                Center.Y += DimY / 2;
                break;

            case AAFace.ZMinus:
                Center.Z -= DimZ / 2;
                break;

            case AAFace.ZPlus:
                Center.Z += DimZ / 2;
                break;
            }

            return(Center);
        }
Exemplo n.º 4
0
        public List <AAFace> GetFaceList(AAFace face)
        {
            List <AAFace> Faces = new List <AAFace>();

            switch (face)
            {
            case AAFace.XPlus:
                Faces = new List <AAFace>()
                {
                    AAFace.XPlus, AAFace.ZMinus, AAFace.ZPlus, AAFace.YPlus, AAFace.YMinus
                };
                break;

            case AAFace.XMinus:
                Faces = new List <AAFace>()
                {
                    AAFace.XMinus, AAFace.ZPlus, AAFace.ZMinus, AAFace.YPlus, AAFace.YMinus
                };
                break;

            case AAFace.ZPlus:
                Faces = new List <AAFace>()
                {
                    AAFace.ZPlus, AAFace.XPlus, AAFace.XMinus, AAFace.YPlus, AAFace.YMinus
                };
                break;

            case AAFace.ZMinus:
                Faces = new List <AAFace>()
                {
                    AAFace.ZMinus, AAFace.XMinus, AAFace.XPlus, AAFace.YPlus, AAFace.YMinus
                };
                break;

            case AAFace.YPlus:
                Faces = new List <AAFace>()
                {
                    AAFace.YPlus, AAFace.XPlus, AAFace.XMinus, AAFace.ZMinus, AAFace.ZPlus
                };
                break;

            case AAFace.YMinus:
                Faces = new List <AAFace>()
                {
                    AAFace.YMinus, AAFace.XMinus, AAFace.XPlus, AAFace.ZMinus, AAFace.ZPlus
                };
                break;
            }
            return(Faces);
        }
Exemplo n.º 5
0
        void ComputeViewFactor()
        {
            // Components
            SatComponent Source     = Model.Components[RadSourceIdx];
            SatComponent Target     = Model.Components[RadTargetIdx];
            AAFace       SourceFace = FaceList[RadSourceFaceIdx];
            // Areas
            float SourceArea      = Source.GetBBoxTotalArea();
            float SourceFaceArea  = Source.GetBBoxFaceArea(SourceFace);
            float TargetArea      = Target.GetBBoxTotalArea();
            float AreaRatioSource = SourceFaceArea / SourceArea;
            // Adjust for large sources (since only looking from one position)
            float AreaRatioSourceTarget = SourceArea / TargetArea > 1 ? SourceArea / TargetArea : 1;
            // View factor F_s->t
            float Factor = GetPixelSum(RTViewFactor) / AreaRatioSourceTarget;
            // Area-weighted view factors
            float WeightedFactor = Factor * AreaRatioSource; // * AreaRatioTarget;
                                                             // Save results
            string SourceName = Source.Name;
            string TargetName = Target.Name;

            VFPerFace.Add(new ViewFactorPerFace(SourceName, TargetName, SourceFace, WeightedFactor));
            // Text output
            if (!Settings.f_ComputationRunning || Settings.f_Verbose)
            {
                Console.Write("From (" + SourceName + "," + SourceFace + ")");
                Console.WriteLine(" to (" + TargetName + ")");
                Console.Write("\t Weighted view factor = " + WeightedFactor.ToString("F6", Settings.Format));
                Console.WriteLine(" (" + Factor.ToString("F3", Settings.Format) + ")");
                Console.WriteLine("\t Source area ratio = " + AreaRatioSource.ToString("F4", Settings.Format));
            }
            Settings.f_ComputeArea = false;
            // Save values for verification
            if (f_StartVerification)
            {
                v_Results.Add(v_StepNum * v_DistStep, Factor);
            }
            // Progress
            if (Settings.f_ComputationRunning)
            {
                if ((CurrentCalc % (int)Math.Ceiling(MaxCalc / 10.0f)) == 0)
                {
                    Console.Write('.');
                }
            }
        }
Exemplo n.º 6
0
        public void DrawBoundingBoxFace(Camera cam, AAFace face, Color color)
        {
            // Setup effect
            Effect.CurrentTechnique = Effect.Techniques["BasicColorDrawing"];
            Effect.Parameters["WorldViewProjection"].SetValue(cam.World * cam.View * cam.Projection);
            Effect.Parameters["ComponentColor"].SetValue(color.ToVector3());
            Effect.Parameters["Alpha"].SetValue(1.0f);

            // Get vertices
            VertexPositionColor[] Verts = BBoxVertices[(int)face];

            // Draw vertices
            foreach (EffectPass pass in Effect.CurrentTechnique.Passes)
            {
                pass.Apply();
                GFX.DrawUserPrimitives(PrimitiveType.TriangleList, Verts, 0, Verts.Length / 3);
            }
        }
Exemplo n.º 7
0
        public float GetBBoxFaceArea(AAFace face)
        {
            switch (face)
            {
            case AAFace.XMinus:
            case AAFace.XPlus:
                return(AreaX);

            case AAFace.YMinus:
            case AAFace.YPlus:
                return(AreaY);

            case AAFace.ZMinus:
            case AAFace.ZPlus:
                return(AreaZ);

            default:
                return(-1);
            }
        }
Exemplo n.º 8
0
 public ViewFactorPerFace(string sourceName, string targetName, AAFace sourceFace, float factor)
 {
     Coordinate = new ViewFactorCoordinate(sourceName, targetName);
     Factor     = factor;
     SourceFace = sourceFace;
 }
Exemplo n.º 9
0
        void MergeHemiCubeTextures()
        {
            // Prepare variables
            int       TextureSize       = Settings.D_HemiCubeResolution;
            AAFace    CurrentSourceFace = FaceList[RadSourceFaceIdx];
            Vector2   Origin            = Vector2.One * TextureSize * 0.5f;
            Vector2   Position;
            Rectangle Source;
            float     Rotation;

            // Init drawing (around texture center)
            GraphicsDevice.SetRenderTarget(RTHemiCube);
            GraphicsDevice.Clear(Color.DarkRed);
            SBatch.Begin();

            #region front

            switch (CurrentSourceFace)
            {
            case AAFace.YPlus:
                Source   = new Rectangle(0, 0, TextureSize, TextureSize);
                Position = Vector2.One * TextureSize;
                Rotation = MathHelper.PiOver2;
                break;

            default:
                Source   = new Rectangle(0, 0, TextureSize, TextureSize);
                Position = Vector2.One * TextureSize;
                Rotation = 0;
                break;
            }
            SBatch.Draw(HemiCube.TFront, Position, Source, Color.White, Rotation, Origin, 1.0f, SpriteEffects.None, 0.0f);

            #endregion

            #region left

            switch (CurrentSourceFace)
            {
            case AAFace.YPlus:
                Source   = new Rectangle(0, 0, TextureSize, TextureSize / 2);
                Position = new Vector2(0, 1.0f) * TextureSize;
                Rotation = MathHelper.PiOver2;
                break;

            case AAFace.YMinus:
                Source   = new Rectangle(0, TextureSize / 2, TextureSize, TextureSize / 2);
                Position = new Vector2(0.5f, 1.0f) * TextureSize;
                Rotation = -MathHelper.PiOver2;
                break;

            default:
                Source   = new Rectangle(TextureSize / 2, 0, TextureSize / 2, TextureSize);
                Position = new Vector2(0.5f, 1.0f) * TextureSize;
                Rotation = 0;
                break;
            }
            SBatch.Draw(HemiCube.TLeft, Position, Source, Color.White, Rotation, Origin, 1.0f, SpriteEffects.None, 0.0f);

            #endregion

            #region right

            switch (CurrentSourceFace)
            {
            case AAFace.YPlus:
                Source   = new Rectangle(0, 0, TextureSize, TextureSize / 2);
                Position = new Vector2(2.0f, 1.0f) * TextureSize;
                Rotation = -MathHelper.PiOver2;
                break;

            case AAFace.YMinus:
                Source   = new Rectangle(0, TextureSize / 2, TextureSize, TextureSize / 2);
                Position = new Vector2(1.5f, 1.0f) * TextureSize;
                Rotation = MathHelper.PiOver2;
                break;

            default:
                Source   = new Rectangle(0, 0, TextureSize / 2, TextureSize);
                Position = new Vector2(2.0f, 1.0f) * TextureSize;
                Rotation = 0;
                break;
            }

            SBatch.Draw(HemiCube.TRight, Position, Source, Color.White, Rotation, Origin, 1.0f, SpriteEffects.None, 0.0f);

            #endregion

            #region up

            switch (CurrentSourceFace)
            {
            case AAFace.ZPlus:
                Source   = new Rectangle(TextureSize / 2, 0, TextureSize / 2, TextureSize);
                Position = new Vector2(1.0f, 0.5f) * TextureSize;
                Rotation = MathHelper.PiOver2;
                break;

            case AAFace.ZMinus:
                Source   = new Rectangle(0, 0, TextureSize / 2, TextureSize);
                Position = new Vector2(1.0f, 0) * TextureSize;
                Rotation = -MathHelper.PiOver2;
                break;

            case AAFace.YPlus:
                Source   = new Rectangle(0, 0, TextureSize, TextureSize / 2);
                Position = new Vector2(1.0f, 0) * TextureSize;
                Rotation = MathHelper.Pi;
                break;

            case AAFace.XMinus:
                Source   = new Rectangle(0, 0, TextureSize, TextureSize / 2);
                Position = new Vector2(1.0f, 0.0f) * TextureSize;
                Rotation = MathHelper.Pi;
                break;

            default:
                Source   = new Rectangle(0, TextureSize / 2, TextureSize, TextureSize / 2);
                Position = new Vector2(1.0f, 0.5f) * TextureSize;
                Rotation = 0;
                break;
            }
            SBatch.Draw(HemiCube.TUp, Position, Source, Color.White, Rotation, Origin, 1.0f, SpriteEffects.None, 0.0f);

            #endregion

            #region down

            switch (CurrentSourceFace)
            {
            case AAFace.ZPlus:
                Source   = new Rectangle(TextureSize / 2, 0, TextureSize / 2, TextureSize);
                Position = new Vector2(1.0f, 1.5f) * TextureSize;
                Rotation = -MathHelper.PiOver2;
                break;

            case AAFace.ZMinus:
                Source   = new Rectangle(0, 0, TextureSize / 2, TextureSize);
                Position = new Vector2(1.0f, 2.0f) * TextureSize;
                Rotation = MathHelper.PiOver2;
                break;

            case AAFace.YMinus:
                Source   = new Rectangle(0, TextureSize / 2, TextureSize, TextureSize / 2);
                Position = new Vector2(1.0f, 1.5f) * TextureSize;
                Rotation = MathHelper.Pi;
                break;

            case AAFace.XMinus:
                Source   = new Rectangle(0, TextureSize / 2, TextureSize, TextureSize / 2);
                Position = new Vector2(1.0f, 1.5f) * TextureSize;
                Rotation = MathHelper.Pi;
                break;

            default:
                Source   = new Rectangle(0, 0, TextureSize, TextureSize / 2);
                Position = new Vector2(1.0f, 2.0f) * TextureSize;
                Rotation = 0;
                break;
            }
            SBatch.Draw(HemiCube.TDown, Position, Source, Color.White, Rotation, Origin, 1.0f, SpriteEffects.None, 0.0f);

            #endregion

            SBatch.End();
        }
Exemplo n.º 10
0
        protected override void Draw(GameTime gameTime)
        {
            AAFace SourceFace = FaceList[RadSourceFaceIdx];

            #region free view

            if (!Settings.f_ComputationRunning)
            {
                GraphicsDevice.SetRenderTarget(RTFree);
                GraphicsDevice.Clear(Color.White);
                Model.DrawCompleteModel(CamFree, false, Color.Black, -1, true);
                Model.Components[RadSourceIdx].DrawBoundingBoxFace(CamFree, SourceFace, Color.Firebrick);
                Model.Components[RadTargetIdx].DrawMesh(CamFree, Color.Green);
                // Draw pointer
                if (Settings.f_DrawPointer)
                {
                    Vector3 CamPosition = Model.Components[RadSourceIdx].GetFaceCenter(SourceFace);
                    DrawModel(CamFree, Pointer, CamPosition);
                    foreach (AAFace face in HemiCube.GetFaceList(SourceFace))
                    {
                        DrawModel(CamFree, Pointer, Model.Components[RadSourceIdx].GetFaceDirection(CamPosition, face));
                    }
                }
            }

            #endregion

            #region verification

            if (f_StartVerification)
            {
                CamHemiCube.TranslateZ(v_StepNum * v_DistStep);
            }

            #endregion

            #region hemicube view

            // Generate HemiCube textures
            DrawHemiCubeTextures(SourceFace, Model.Components[RadSourceIdx]);
            MergeHemiCubeTextures();

            // Apply transfer map
            GraphicsDevice.SetRenderTarget(RTViewFactor);
            GraphicsDevice.Clear(Color.White);
            ApplyMultiplierMap();

            #endregion

            #region rendertargets

            // Draw rendertargets
            GraphicsDevice.SetRenderTarget(null);
            GraphicsDevice.Clear(Color.White);
            SBatch.Begin();

            // Free view
            if (!Settings.f_ComputationRunning)
            {
                SBatch.Draw(RTFree, RTFree.Bounds, Color.White);
            }

            // View factor map
            Vector2 Position = new Vector2(RTFree.Bounds.Width, 0);
            SBatch.Draw(RTViewFactor, Position, Color.White);

            // Multiplier texture
            if (Settings.f_DrawMultiplierMap)
            {
                SBatch.Draw(HemiCube.MultiplierMap, Position, Color.White);
            }

            // FPS counter
            string Text = TimerMaxFPS + " fps";
            Position = Settings.D_FontPadding * Vector2.One;
            SBatch.DrawString(Font, Text, Position, Color.Black);

            SBatch.End();

            #endregion

            if (Settings.f_ComputeArea)
            {
                ComputeViewFactor();
            }

            base.Draw(gameTime);
        }