Merge branch 'development' of https://github.com/MatterHackers/MatterControl into development

This commit is contained in:
larsbrubaker 2015-05-05 20:07:12 -07:00
commit ee8be322da
4 changed files with 140 additions and 35 deletions

View file

@ -48,6 +48,12 @@ namespace MatterHackers.MatterControl
{
public class PartThumbnailWidget : ClickWidget
{
const int tooBigAndroid = 50000000;
const int tooBigDesktop = 250000000;
const int renderOrthoAndroid = 20000000;
const int renderOrthoDesktop = 100000000;
// all the color stuff
new public double BorderWidth = 0;
@ -318,10 +324,37 @@ namespace MatterHackers.MatterControl
return imageFileName;
}
private static RenderType GetRenderType(string pathToMeshFile)
private static RenderType GetRenderType(string fileLocation)
{
return RenderType.ORTHOGROPHIC;
if (Is32Bit())
{
long estimatedMemoryUse = 0;
if (File.Exists(fileLocation))
{
estimatedMemoryUse = MeshFileIo.GetEstimatedMemoryUse(fileLocation);
if (OsInformation.OperatingSystem == OSType.Android)
{
if (estimatedMemoryUse > renderOrthoAndroid)
{
return RenderType.ORTHOGROPHIC;
}
}
else
{
if (estimatedMemoryUse > renderOrthoDesktop)
{
return RenderType.ORTHOGROPHIC;
}
}
}
}
return RenderType.RAY_TRACE;
}
private static ImageBuffer LoadImageFromDisk(PartThumbnailWidget thumbnailWidget, string stlHashCode, Point2D size)
{
ImageBuffer tempImage = new ImageBuffer(size.x, size.y, 32, new BlenderBGRA());
@ -406,6 +439,7 @@ namespace MatterHackers.MatterControl
}
break;
case RenderType.NONE:
case RenderType.ORTHOGROPHIC:
thumbnailWidget.thumbnailImage = new ImageBuffer(thumbnailWidget.buildingThumbnailImage);
@ -586,6 +620,19 @@ namespace MatterHackers.MatterControl
UiThread.RunOnIdle(this.EnsureImageUpdated);
return true;
}
else if (MeshIsTooBigToLoad(this.PrintItem.FileLocation))
{
CreateImage(this, Width, Height);
this.thumbnailImage.SetRecieveBlender(new BlenderPreMultBGRA());
Graphics2D graphics = this.thumbnailImage.NewGraphics2D();
Vector2 center = new Vector2(Width / 2.0, Height / 2.0);
double yOffset = 8 * Width / 50 * TextWidget.GlobalPointSizeScaleRatio * 1.5;
graphics.DrawString("Too Big\nto\nRender", center.x, center.y + yOffset, 8 * Width / 50, Agg.Font.Justification.Center, Agg.Font.Baseline.BoundsCenter, color: RGBA_Bytes.White);
UiThread.RunOnIdle(this.EnsureImageUpdated);
return true;
//GetRenderType(thumbnailWidget.PrintItem.FileLocation);
}
string stlHashCode = this.PrintItem.FileHashCode.ToString();
@ -617,6 +664,46 @@ namespace MatterHackers.MatterControl
return true;
}
private static bool Is32Bit()
{
if (IntPtr.Size == 4)
{
return true;
}
return false;
}
private bool MeshIsTooBigToLoad(string fileLocation)
{
if (Is32Bit())
{
long estimatedMemoryUse = 0;
if (File.Exists(fileLocation))
{
estimatedMemoryUse = MeshFileIo.GetEstimatedMemoryUse(fileLocation);
if (OsInformation.OperatingSystem == OSType.Android)
{
if (estimatedMemoryUse > tooBigAndroid)
{
return true;
}
}
else
{
if (estimatedMemoryUse > tooBigDesktop)
{
return true;
}
}
}
}
return false;
}
private void TryLoad(object sender, DoWorkEventArgs e)
{
using (TimedLock.Lock(this, "TryLoad"))

View file

@ -51,7 +51,7 @@ namespace MatterHackers.RayTracer
private Transform allObjectsHolder;
private MeshGroup loadedMeshGroup;
private List<MeshGroup> loadedMeshGroups;
//RayTracer raytracer = new RayTracer(AntiAliasing.None, true, true, true, true, true);
//RayTracer raytracer = new RayTracer(AntiAliasing.Low, true, true, true, true, true);
@ -71,8 +71,8 @@ namespace MatterHackers.RayTracer
trackballTumbleWidget.DoOpenGlDrawing = false;
trackballTumbleWidget.LocalBounds = new RectangleDouble(0, 0, width, height);
loadedMeshGroup = meshGroups[0];
SetRenderPosition(loadedMeshGroup);
loadedMeshGroups = meshGroups;
SetRenderPosition(loadedMeshGroups);
trackballTumbleWidget.AnchorCenter();
}
@ -90,7 +90,7 @@ namespace MatterHackers.RayTracer
raytracer.CopyColorBufferToImage(destImage, rect);
}
public void SetRenderPosition(MeshGroup loadedMeshGroup)
public void SetRenderPosition(List<MeshGroup> loadedMeshGroups)
{
trackballTumbleWidget.TrackBallController.Reset();
trackballTumbleWidget.TrackBallController.Scale = .03;
@ -98,7 +98,7 @@ namespace MatterHackers.RayTracer
trackballTumbleWidget.TrackBallController.Rotate(Quaternion.FromEulerAngles(new Vector3(0, 0, MathHelper.Tau / 16)));
trackballTumbleWidget.TrackBallController.Rotate(Quaternion.FromEulerAngles(new Vector3(-MathHelper.Tau * .19, 0, 0)));
ScaleMeshToView(loadedMeshGroup);
ScaleMeshToView(loadedMeshGroups);
}
private void AddAFloor()
@ -161,20 +161,47 @@ namespace MatterHackers.RayTracer
graphics2D.Rasterizer.gamma(new gamma_none());
}
private void AddTestMesh(MeshGroup meshGroup)
AxisAlignedBoundingBox GetAxisAlignedBoundingBox(List<MeshGroup> meshGroups)
{
loadedMeshGroup = meshGroup;
AxisAlignedBoundingBox meshBounds = loadedMeshGroup.GetAxisAlignedBoundingBox();
Vector3 meshCenter = meshBounds.Center;
loadedMeshGroup.Translate(-meshCenter);
AxisAlignedBoundingBox totalMeshBounds = new AxisAlignedBoundingBox(Vector3.NegativeInfinity, Vector3.NegativeInfinity);
bool first = true;
foreach (MeshGroup meshGroup in meshGroups)
{
AxisAlignedBoundingBox meshBounds = meshGroup.GetAxisAlignedBoundingBox();
if (first)
{
totalMeshBounds = meshBounds;
first = false;
}
else
{
totalMeshBounds = AxisAlignedBoundingBox.Union(totalMeshBounds, meshBounds);
}
}
ScaleMeshToView(loadedMeshGroup);
return totalMeshBounds;
}
RGBA_Bytes partColor = new RGBA_Bytes(0, 130, 153);
partColor = RGBA_Bytes.White;
IPrimitive bvhCollection = MeshToBVH.Convert(loadedMeshGroup, new SolidMaterial(partColor.GetAsRGBA_Floats(), .01, 0.0, 2.0));
private void AddTestMesh(List<MeshGroup> meshGroups)
{
if (meshGroups != null)
{
AxisAlignedBoundingBox totalMeshBounds = GetAxisAlignedBoundingBox(meshGroups);
loadedMeshGroups = meshGroups;
Vector3 meshCenter = totalMeshBounds.Center;
foreach (MeshGroup meshGroup in meshGroups)
{
meshGroup.Translate(-meshCenter);
}
renderCollection.Add(bvhCollection);
ScaleMeshToView(loadedMeshGroups);
RGBA_Bytes partColor = new RGBA_Bytes(0, 130, 153);
partColor = RGBA_Bytes.White;
IPrimitive bvhCollection = MeshToBVH.Convert(loadedMeshGroups, new SolidMaterial(partColor.GetAsRGBA_Floats(), .01, 0.0, 2.0));
renderCollection.Add(bvhCollection);
}
}
private void CreateScene()
@ -184,7 +211,7 @@ namespace MatterHackers.RayTracer
//scene.background = new Background(new RGBA_Floats(0.5, .5, .5), 0.4);
scene.background = new Background(new RGBA_Floats(0, 0, 0, 0), 0.4);
AddTestMesh(loadedMeshGroup);
AddTestMesh(loadedMeshGroups);
allObjects = BoundingVolumeHierarchy.CreateNewHierachy(renderCollection);
allObjectsHolder = new Transform(allObjects);
@ -198,7 +225,7 @@ namespace MatterHackers.RayTracer
scene.lights.Add(new PointLight(new Vector3(-5000, -5000, 3000), new RGBA_Floats(0.5, 0.5, 0.5)));
}
private RectangleDouble GetScreenBounds(AxisAlignedBoundingBox meshBounds, MeshGroup loadedMeshGroup)
private RectangleDouble GetScreenBounds(AxisAlignedBoundingBox meshBounds)
{
RectangleDouble screenBounds = RectangleDouble.ZeroIntersection;
@ -227,11 +254,11 @@ namespace MatterHackers.RayTracer
return false;
}
private void ScaleMeshToView(MeshGroup loadedMeshGroup)
private void ScaleMeshToView(List<MeshGroup> loadedMeshGroups)
{
if (loadedMeshGroup != null)
if (loadedMeshGroups != null)
{
AxisAlignedBoundingBox meshBounds = loadedMeshGroup.GetAxisAlignedBoundingBox(); // get it now that we moved it.
AxisAlignedBoundingBox meshBounds = GetAxisAlignedBoundingBox(loadedMeshGroups);
bool done = false;
double scallFraction = .1;
@ -239,12 +266,12 @@ namespace MatterHackers.RayTracer
goalBounds.Inflate(-10);
while (!done)
{
RectangleDouble partScreenBounds = GetScreenBounds(meshBounds, loadedMeshGroup);
RectangleDouble partScreenBounds = GetScreenBounds(meshBounds);
if (!NeedsToBeSmaller(partScreenBounds, goalBounds))
{
trackballTumbleWidget.TrackBallController.Scale *= (1 + scallFraction);
partScreenBounds = GetScreenBounds(meshBounds, loadedMeshGroup);
partScreenBounds = GetScreenBounds(meshBounds);
// If it crossed over the goal reduct the amount we are adjusting by.
if (NeedsToBeSmaller(partScreenBounds, goalBounds))
@ -255,7 +282,7 @@ namespace MatterHackers.RayTracer
else
{
trackballTumbleWidget.TrackBallController.Scale *= (1 - scallFraction);
partScreenBounds = GetScreenBounds(meshBounds, loadedMeshGroup);
partScreenBounds = GetScreenBounds(meshBounds);
// If it crossed over the goal reduct the amount we are adjusting by.
if (!NeedsToBeSmaller(partScreenBounds, goalBounds))

View file

@ -311,16 +311,7 @@ namespace MatterHackers.MatterControl.PrintQueue
if (File.Exists(item.FileLocation)
&& checkSize == ValidateSizeOn32BitSystems.Required)
{
switch (Path.GetExtension(item.FileLocation).ToUpper())
{
case ".STL":
estimatedMemoryUse = StlProcessing.GetEstimatedMemoryUse(item.FileLocation);
break;
case ".AMF":
estimatedMemoryUse = AmfProcessing.GetEstimatedMemoryUse(item.FileLocation);
break;
}
estimatedMemoryUse = MeshFileIo.GetEstimatedMemoryUse(item.FileLocation);
if (OsInformation.OperatingSystem == OSType.Android)
{

@ -1 +1 @@
Subproject commit fb4bb934052fc39dc38180a8dd17bcda6faf59a2
Subproject commit e2537da2f53c63843ce8349ed81bfffc87e9f214