本文整理汇总了C#中BoundingBoxD.Inflate方法的典型用法代码示例。如果您正苦于以下问题:C# BoundingBoxD.Inflate方法的具体用法?C# BoundingBoxD.Inflate怎么用?C# BoundingBoxD.Inflate使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类BoundingBoxD
的用法示例。
在下文中一共展示了BoundingBoxD.Inflate方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: PrepareVoxelTriangleTests
public void PrepareVoxelTriangleTests(BoundingBoxD cellBoundingBox, List<MyCubeGrid> gridsToTestOutput)
{
ProfilerShort.Begin("PrepareVoxelTriangleTests");
m_tmpEntityList.Clear();
// Each triangle will be tested with grids up to one largest cube further away from them, so we have to reflect this in the bounding box.
float largeCubeSize = MyDefinitionManager.Static.GetCubeSize(MyCubeSize.Large);
cellBoundingBox.Inflate(largeCubeSize);
// Furthermore, a triangle cannot lie in a cube under existing block, so we have to extend the bbox even further
if (MyPerGameSettings.NavmeshPresumesDownwardGravity)
{
var min = cellBoundingBox.Min;
min.Y -= largeCubeSize;
cellBoundingBox.Min = min;
}
MyGamePruningStructure.GetAllEntitiesInBox(ref cellBoundingBox, m_tmpEntityList);
foreach (var entity in m_tmpEntityList)
{
var grid = entity as MyCubeGrid;
if (grid == null) continue;
if (!MyGridPathfinding.GridCanHaveNavmesh(grid)) continue;
gridsToTestOutput.Add(grid);
}
m_tmpEntityList.Clear();
ProfilerShort.End();
}
示例2: DefaultGizmoCloseEnough
public static bool DefaultGizmoCloseEnough(ref MatrixD invGridWorldMatrix, BoundingBoxD gizmoBox, float gridSize, float intersectionDistance)
{
//MyRenderProxy.DebugDrawText2D(new Vector2(0.0f, 0.0f), "Intersection distance = " + intersectionDistance, Color.Red, 1.0f);
var m = invGridWorldMatrix;
MyCharacter character = MySession.LocalCharacter;
if (character == null)
return false;
// Character head for measuring distance to intesection.
Vector3D originHead = character.GetHeadMatrix(true).Translation;
// Camera position adn direction. Used for ray cast to cube block box.
Vector3D originCamera = MySector.MainCamera.Position;
Vector3 direction = MySector.MainCamera.ForwardVector;
Vector3 localHead = Vector3D.Transform(originHead, m);
Vector3 localStart = Vector3D.Transform(originCamera, m);
Vector3 localEnd = Vector3D.Transform(originCamera + direction * intersectionDistance, m);
LineD line = new LineD(localStart, localEnd);
// AABB of added block
float inflate = 0.025f * gridSize;
gizmoBox.Inflate(inflate);
/*{
Vector4 blue = Color.Blue.ToVector4();
Matrix mtx = Matrix.Invert(invGridWorldMatrix);
MySimpleObjectDraw.DrawTransparentBox(ref mtx, ref gizmoBox, ref blue, MySimpleObjectRasterizer.Wireframe, 1, 0.04f);
}*/
double distance = double.MaxValue;
if (gizmoBox.Intersects(line, out distance))
{
// Distance from the player's head to the gizmo box.
double distanceToPlayer = gizmoBox.Distance(localHead);
return distanceToPlayer <= 5.0;
}
return false;
}
示例3: GetFreeSpacePlacementPositionGridAabbs
/// <summary>
/// Casts preview grids aabbs and get shortest distance. Returns shortest intersection or null.
/// </summary>
protected Vector3D? GetFreeSpacePlacementPositionGridAabbs(bool copyPaste, out bool buildAllowed)
{
Vector3D? freePlacementIntersectionPoint = null;
buildAllowed = true;
float gridSize = PreviewGrids[0].GridSize;
double shortestDistance = double.MaxValue;
double? currentRayInts = GetCurrentRayIntersection();
if (currentRayInts.HasValue)
shortestDistance = currentRayInts.Value;
Vector3D worldRefPointOffset = Vector3D.Zero;
if (copyPaste)
{
Matrix firstGridOrientation = GetFirstGridOrientationMatrix();
worldRefPointOffset = Vector3.TransformNormal(m_dragPointToPositionLocal, firstGridOrientation);
}
Vector3D worldRefPoint = PreviewGrids[0].GridIntegerToWorld(Vector3I.Zero);
foreach (var grid in PreviewGrids)
{
Vector3 halfExt = grid.PositionComp.LocalAABB.HalfExtents;
Vector3 minLocal = grid.Min * grid.GridSize - Vector3.Half * grid.GridSize;
Vector3 maxLocal = grid.Max * grid.GridSize + Vector3.Half * grid.GridSize;
MatrixD gridWorlTransform = MatrixD.Identity;
gridWorlTransform.Translation = 0.5f * (minLocal + maxLocal);
gridWorlTransform = gridWorlTransform * grid.WorldMatrix;
Vector3I size = grid.Max - grid.Min + Vector3I.One;
Vector3 sizeOffset = Vector3I.Abs((size % 2) - Vector3I.One) * 0.5 * grid.GridSize;
sizeOffset = Vector3.TransformNormal(sizeOffset, grid.WorldMatrix);
Vector3D offset = gridWorlTransform.Translation + worldRefPointOffset - worldRefPoint /*- sizeOffset*/;// Vector3.Zero;// gridWorlTransform.Translation + worldRefPointOffset - worldRefPoint;
HkShape shape = new HkBoxShape(halfExt);
Vector3D rayStart = MyCubeBuilder.IntersectionStart + offset;
double castPlaneDistanceToRayStart = DistanceFromCharacterPlane(ref rayStart);
rayStart -= castPlaneDistanceToRayStart * MyCubeBuilder.IntersectionDirection;
Vector3D rayEnd = MyCubeBuilder.IntersectionStart + (m_dragDistance - castPlaneDistanceToRayStart) * MyCubeBuilder.IntersectionDirection + offset;
MatrixD matrix = gridWorlTransform;
matrix.Translation = rayStart;
try
{
float? dist = MyPhysics.CastShape(rayEnd, shape, ref matrix, MyPhysics.CollisionLayerWithoutCharacter);
if (dist.HasValue && dist.Value != 0f)
{
Vector3D intersectionPoint = rayStart + dist.Value * (rayEnd - rayStart);
const bool debugDraw = true;
if (debugDraw)
{
Color green = Color.Green;
BoundingBoxD localAABB = new BoundingBoxD(-halfExt, halfExt);
localAABB.Inflate(0.03f);
MatrixD drawMatrix = matrix;
drawMatrix.Translation = intersectionPoint;
MySimpleObjectDraw.DrawTransparentBox(ref drawMatrix, ref localAABB, ref green, MySimpleObjectRasterizer.Wireframe, 1, 0.04f);
}
double fixedDistance = DistanceFromCharacterPlane(ref intersectionPoint) - castPlaneDistanceToRayStart;
if (fixedDistance <= 0)
{
fixedDistance = 0;
shortestDistance = 0;
buildAllowed = false;
break;
}
if (fixedDistance < shortestDistance)
shortestDistance = fixedDistance;
}
else
{
buildAllowed = false;
}
}
finally
{
shape.RemoveReference();
}
}
if (shortestDistance != 0 && shortestDistance < m_dragDistance)
freePlacementIntersectionPoint = MyCubeBuilder.IntersectionStart + shortestDistance * MyCubeBuilder.IntersectionDirection;
else
buildAllowed = false;
return freePlacementIntersectionPoint;
}
示例4: TryFindLocationOutsideForestInternal
private bool TryFindLocationOutsideForestInternal(Vector3D? desiredLocationSize, out Vector3D location, Predicate<AreaData> predicate = null)
{
Vector3D desiredHalfSize = desiredLocationSize.HasValue ? desiredLocationSize.Value * 0.5f : Vector3D.Zero;
desiredHalfSize.Y = 0;
if (m_highLevelBoxes.Count == 0)
{
// no forest on the map, generate starting point
bool valid = false;
while (m_initialForestLocations.Count > 0 && !valid)
{
var potentialTreePosition = m_initialForestLocations.Dequeue();
valid = true;
BoundingBoxD itemBox = new BoundingBoxD(potentialTreePosition, potentialTreePosition);
itemBox.Inflate(desiredHalfSize);
var entities = MyEntities.GetEntitiesInAABB(ref itemBox);
foreach (var entity in entities)
{
if (entity is MyEnvironmentItems)
continue;
if (entity is MyVoxelBase)
continue;
var entityBox = entity.PositionComp.WorldAABB;
var containment = entityBox.Intersects(itemBox);
if (containment)
{
valid = false;
break;
}
}
entities.Clear();
if (valid)
{
Vector3D end = potentialTreePosition;
end.Y -= 20;
if (RaycastForExactPosition(potentialTreePosition, end, out location))
{
d_foundEnlargingPoints.Add(location);
return true;
}
else
{
valid = false;
}
}
}
location = Vector3D.Zero;
return false;
}
else
{
if (!TryGetRandomAreas(m_tmpAreas))
{
location = Vector3D.Zero;
return false;
}
int areaIdx = 0;
int randomStartIdx = MyUtils.GetRandomInt(m_tmpAreas.Count);
while (areaIdx < m_tmpAreas.Count)
{
var spawnArea = m_tmpAreas[randomStartIdx];
randomStartIdx = (randomStartIdx + 1) % m_tmpAreas.Count;
areaIdx++;
if (!spawnArea.IsValid || spawnArea.IsFull)
continue;
if (predicate != null && !predicate(spawnArea.GetAreaData()))
{
spawnArea.IsFull = true;
continue;
}
var spawnBox = spawnArea.ForestBox;
var forestBox = spawnArea.ForestBox;
spawnBox = forestBox.Inflate(desiredHalfSize);
spawnBox.Inflate(new Vector3D(0.2, 0, 0.2)); // inflate for some minimum size
MyBBSetSampler setSampler = new MyBBSetSampler(spawnBox.Min, spawnBox.Max);
setSampler.SubtractBB(ref forestBox);
RefineSampler(spawnArea, ref spawnBox, ref desiredHalfSize, setSampler);
if (!setSampler.Valid)
continue;
Vector3D exactLocation;
Vector3D samplePosition = setSampler.Sample();
if (TryGetExactLocation(spawnArea, samplePosition, 40, out exactLocation))
{
location = exactLocation;
d_foundEnlargingPoints.Add(exactLocation);
m_tmpAreas.Clear();
return true;
}
else
{
//.........这里部分代码省略.........
示例5: UpdateRenderObject
protected void UpdateRenderObject()
{
m_actualWorldAABB = BoundingBoxD.CreateInvalid();
if (AnimationController.CharacterBones != null)
for (int i = 1; i < Model.Bones.Length; i++)
{
Vector3D p1 = Vector3D.Transform(AnimationController.CharacterBones[i].Parent.AbsoluteTransform.Translation, WorldMatrix);
Vector3D p2 = Vector3D.Transform(AnimationController.CharacterBones[i].AbsoluteTransform.Translation, WorldMatrix);
m_actualWorldAABB.Include(ref p1);
m_actualWorldAABB.Include(ref p2);
}
ContainmentType containmentType;
m_aabb.Contains(ref m_actualWorldAABB, out containmentType);
if (containmentType != ContainmentType.Contains)
{
m_actualWorldAABB.Inflate(0.5f);
MatrixD worldMatrix = WorldMatrix;
VRageRender.MyRenderProxy.UpdateRenderObject(Render.RenderObjectIDs[0], ref worldMatrix, false, m_actualWorldAABB);
m_aabb = m_actualWorldAABB;
}
}
示例6: DefaultGizmoCloseEnough
public static bool DefaultGizmoCloseEnough(ref MatrixD invGridWorldMatrix, BoundingBoxD gizmoBox, float gridSize, float intersectionDistance)
{
//MyRenderProxy.DebugDrawText2D(new Vector2(0.0f, 0.0f), "Intersection distance = " + intersectionDistance, Color.Red, 1.0f);
var m = invGridWorldMatrix;
MyCharacter character = MySession.Static.LocalCharacter;
if (character == null)
return false;
// Character head for measuring distance to intesection.
Vector3D originHead = character.GetHeadMatrix(true).Translation;
// Camera position adn direction. Used for ray cast to cube block box.
Vector3D originCamera = MySector.MainCamera.Position;
Vector3 direction = MySector.MainCamera.ForwardVector;
double cameraHeadDist = (originHead - MySector.MainCamera.Position).Length();
Vector3 localHead = Vector3D.Transform(originHead, m);
Vector3 localStart = Vector3D.Transform(originCamera, m);
Vector3 localEnd = Vector3D.Transform(originCamera + direction * (intersectionDistance + (float)cameraHeadDist), m);
LineD line = new LineD(localStart, localEnd);
// AABB of added block
float inflate = 0.025f * gridSize;
gizmoBox.Inflate(inflate);
//{
// Color blue = Color.Blue;
// MatrixD mtx = MatrixD.Invert(invGridWorldMatrix);
// MySimpleObjectDraw.DrawTransparentBox(ref mtx, ref gizmoBox, ref blue, MySimpleObjectRasterizer.Wireframe, 1, 0.04f);
// MyRenderProxy.DebugDrawLine3D(originCamera, originCamera + direction * (intersectionDistance + (float)cameraHeadDist), Color.Red, Color.Red, false);
//}
double distance = double.MaxValue;
if (gizmoBox.Intersects(ref line, out distance))
{
// Distance from the player's head to the gizmo box.
double distanceToPlayer = gizmoBox.Distance(localHead);
if (MySession.Static.ControlledEntity is MyShipController)
{
if (MyCubeBuilder.Static.CubeBuilderState.CurrentBlockDefinition.CubeSize == MyCubeSize.Large)
return distanceToPlayer <= MyCubeBuilder.CubeBuilderDefinition.BuildingDistLargeSurvivalShip;
else
return distanceToPlayer <= MyCubeBuilder.CubeBuilderDefinition.BuildingDistSmallSurvivalShip;
}
else
{
if (MyCubeBuilder.Static.CubeBuilderState.CurrentBlockDefinition.CubeSize == MyCubeSize.Large)
return distanceToPlayer <= MyCubeBuilder.CubeBuilderDefinition.BuildingDistLargeSurvivalCharacter;
else
return distanceToPlayer <= MyCubeBuilder.CubeBuilderDefinition.BuildingDistSmallSurvivalCharacter;
}
}
return false;
}