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); }
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); } } }
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); }
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); }
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('.'); } } }
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); } }
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); } }
public ViewFactorPerFace(string sourceName, string targetName, AAFace sourceFace, float factor) { Coordinate = new ViewFactorCoordinate(sourceName, targetName); Factor = factor; SourceFace = sourceFace; }
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(); }
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); }