Esempio n. 1
0
        public void Render3D(GCodeRenderInfo renderInfo)
        {
            if (layerVertexBuffer == null)
            {
                layerVertexBuffer          = new List <GCodeVertexBuffer>();
                layerVertexBuffer.Capacity = gCodeFileToDraw.NumChangesInZ;
                for (int layerIndex = 0; layerIndex < gCodeFileToDraw.NumChangesInZ; layerIndex++)
                {
                    layerVertexBuffer.Add(null);
                    featureStartIndex.Add(new List <int>());
                    featureEndIndex.Add(new List <int>());
                }
            }

            for (int layerIndex = 0; layerIndex < gCodeFileToDraw.NumChangesInZ; layerIndex++)
            {
                CreateFeaturesForLayerIfRequired(layerIndex);
            }

            if (lastRenderType != renderInfo.CurrentRenderType)
            {
                Clear3DGCode();
                lastRenderType = renderInfo.CurrentRenderType;
            }

            if (renderFeatures.Count > 0)
            {
                for (int i = renderInfo.EndLayerIndex - 1; i >= renderInfo.StartLayerIndex; i--)
                {
                    // If its the first render or we change what we are trying to render then create vertex data.
                    if (layerVertexBuffer[i] == null)
                    {
                        VectorPOD <ColorVertexData> colorVertexData  = new VectorPOD <ColorVertexData>();
                        VectorPOD <int>             vertexIndexArray = new VectorPOD <int>();

                        Create3DDataForLayer(i, colorVertexData, vertexIndexArray, renderInfo);

                        layerVertexBuffer[i] = new GCodeVertexBuffer();
                        layerVertexBuffer[i].SetVertexData(colorVertexData.Array);
                        layerVertexBuffer[i].SetIndexData(vertexIndexArray.Array);
                    }
                }

                GL.Disable(EnableCap.Texture2D);
                GL.PushAttrib(AttribMask.EnableBit);
                GL.DisableClientState(ArrayCap.TextureCoordArray);
                GL.Enable(EnableCap.PolygonSmooth);

                if (renderInfo.EndLayerIndex - 1 > renderInfo.StartLayerIndex)
                {
                    for (int i = renderInfo.StartLayerIndex; i < renderInfo.EndLayerIndex - 1; i++)
                    {
                        int featuresOnLayer = renderFeatures[i].Count;
                        if (featuresOnLayer > 1)
                        {
                            layerVertexBuffer[i].renderRange(0, featureEndIndex[i][featuresOnLayer - 1]);
                        }
                    }
                }

                // draw the partial layer of end-1 from startRatio to endRatio
                {
                    int layerIndex      = renderInfo.EndLayerIndex - 1;
                    int featuresOnLayer = renderFeatures[layerIndex].Count;
                    int startFeature    = (int)(featuresOnLayer * renderInfo.FeatureToStartOnRatio0To1 + .5);
                    startFeature = Math.Max(0, Math.Min(startFeature, featuresOnLayer));

                    int endFeature = (int)(featuresOnLayer * renderInfo.FeatureToEndOnRatio0To1 + .5);
                    endFeature = Math.Max(0, Math.Min(endFeature, featuresOnLayer));

                    // try to make sure we always draw at least one feature
                    if (endFeature <= startFeature)
                    {
                        endFeature = Math.Min(startFeature + 1, featuresOnLayer);
                    }
                    if (startFeature >= endFeature)
                    {
                        // This can only happen if the start and end are set to the last feature
                        // Try to set the start feature to one from the end
                        startFeature = Math.Max(endFeature - 1, 0);
                    }

                    if (endFeature > startFeature)
                    {
                        int ellementCount = featureEndIndex[layerIndex][endFeature - 1] - featureStartIndex[layerIndex][startFeature];

                        layerVertexBuffer[layerIndex].renderRange(featureStartIndex[layerIndex][startFeature], ellementCount);
                    }
                }
                GL.PopAttrib();
            }
        }
Esempio n. 2
0
		public void Render3D(GCodeRenderInfo renderInfo)
		{
			if (layerVertexBuffer == null)
			{
				layerVertexBuffer = new List<GCodeVertexBuffer>();
				layerVertexBuffer.Capacity = gCodeFileToDraw.NumChangesInZ;
				for (int layerIndex = 0; layerIndex < gCodeFileToDraw.NumChangesInZ; layerIndex++)
				{
					layerVertexBuffer.Add(null);
					featureStartIndex.Add(new List<int>());
					featureEndIndex.Add(new List<int>());
				}
			}

			for (int layerIndex = 0; layerIndex < gCodeFileToDraw.NumChangesInZ; layerIndex++)
			{
				CreateFeaturesForLayerIfRequired(layerIndex);
			}

			if (lastRenderType != renderInfo.CurrentRenderType)
			{
				Clear3DGCode();
				lastRenderType = renderInfo.CurrentRenderType;
			}

			if (renderFeatures.Count > 0)
			{
				for (int i = renderInfo.StartLayerIndex; i < renderInfo.EndLayerIndex; i++)
				{
					// If its the first render or we change what we are trying to render then create vertex data.
					if (layerVertexBuffer[i] == null)
					{
						VectorPOD<ColorVertexData> colorVertexData = new VectorPOD<ColorVertexData>();
						VectorPOD<int> vertexIndexArray = new VectorPOD<int>();

						Create3DDataForLayer(i, colorVertexData, vertexIndexArray, renderInfo);

						layerVertexBuffer[i] = new GCodeVertexBuffer();
						layerVertexBuffer[i].SetVertexData(colorVertexData.Array);
						layerVertexBuffer[i].SetIndexData(vertexIndexArray.Array);
					}
				}

				GL.Disable(EnableCap.Texture2D);
				GL.PushAttrib(AttribMask.EnableBit);
				GL.DisableClientState(ArrayCap.TextureCoordArray);
				GL.Enable(EnableCap.PolygonSmooth);

				if (renderInfo.EndLayerIndex - 1 > renderInfo.StartLayerIndex)
				{
					for (int i = renderInfo.StartLayerIndex; i < renderInfo.EndLayerIndex - 1; i++)
					{
						int featuresOnLayer = renderFeatures[i].Count;
						if (featuresOnLayer > 1)
						{
							layerVertexBuffer[i].renderRange(0, featureEndIndex[i][featuresOnLayer - 1]);
						}
					}
				}

				// draw the partial layer of end-1 from startRatio to endRatio
				{
					int layerIndex = renderInfo.EndLayerIndex - 1;
					int featuresOnLayer = renderFeatures[layerIndex].Count;
					int startFeature = (int)(featuresOnLayer * renderInfo.FeatureToStartOnRatio0To1 + .5);
					startFeature = Math.Max(0, Math.Min(startFeature, featuresOnLayer));

					int endFeature = (int)(featuresOnLayer * renderInfo.FeatureToEndOnRatio0To1 + .5);
					endFeature = Math.Max(0, Math.Min(endFeature, featuresOnLayer));

					// try to make sure we always draw at least one feature
					if (endFeature <= startFeature)
					{
						endFeature = Math.Min(startFeature + 1, featuresOnLayer);
					}
					if (startFeature >= endFeature)
					{
						// This can only happen if the sart and end are set to the last feature
						// Try to set the start feture to one from the end
						startFeature = Math.Max(endFeature - 1, 0);
					}

					if (endFeature > startFeature)
					{
						int ellementCount = featureEndIndex[layerIndex][endFeature - 1] - featureStartIndex[layerIndex][startFeature];

						layerVertexBuffer[layerIndex].renderRange(featureStartIndex[layerIndex][startFeature], ellementCount);
					}
				}
				GL.PopAttrib();
			}
		}
Esempio n. 3
0
		public void Render3D(GCodeRenderInfo renderInfo)
		{
			if (layerVertexBuffer == null)
			{
				layerVertexBuffer = new List<GCodeVertexBuffer>();
				layerVertexBuffer.Capacity = gCodeFileToDraw.NumChangesInZ;
				for (int layerIndex = 0; layerIndex < gCodeFileToDraw.NumChangesInZ; layerIndex++)
				{
					layerVertexBuffer.Add(null);
					featureStartIndex.Add(new List<int>());
					featureEndIndex.Add(new List<int>());
				}
			}

			for (int layerIndex = 0; layerIndex < gCodeFileToDraw.NumChangesInZ; layerIndex++)
			{
				CreateFeaturesForLayerIfRequired(layerIndex);
			}

			if (lastRenderType != renderInfo.CurrentRenderType)
			{
				Clear3DGCode();
				lastRenderType = renderInfo.CurrentRenderType;
			}

			if (renderFeatures.Count > 0)
			{
				if (Is32Bit() && !GL.GlHasBufferObjects)
				{
					int maxFeaturesForThisSystem = 125000;
					int totalFeaturesToRunder = 0;
					bool cleanUnusedLayers = false;
					// if on 32 bit system make sure we don't run out of memory rendering too many features
					for (int i = renderInfo.EndLayerIndex - 1; i >= renderInfo.StartLayerIndex; i--)
					{
						if (totalFeaturesToRunder + renderFeatures[i].Count < maxFeaturesForThisSystem)
						{
							totalFeaturesToRunder += renderFeatures[i].Count;
						}
						else // don't render any of the layers below this and in fact remove them from memory if possible
						{
							renderInfo.startLayerIndex = i + 1;
							cleanUnusedLayers = true; 
							break;
						}
					}

					if (cleanUnusedLayers)
					{
						// no remove any layers that are set that we are not going to render
						for (int removeIndex = 0; removeIndex < layerVertexBuffer.Count; removeIndex++)
						{
							if (removeIndex < renderInfo.StartLayerIndex || removeIndex >= renderInfo.EndLayerIndex)
							{
								if (layerVertexBuffer[removeIndex] != null)
								{
									layerVertexBuffer[removeIndex].Dispose();
									layerVertexBuffer[removeIndex] = null;
								}
							}
						}
					}
				}

				for (int i = renderInfo.EndLayerIndex - 1; i >= renderInfo.StartLayerIndex; i--)
				{
					// If its the first render or we change what we are trying to render then create vertex data.
					if (layerVertexBuffer[i] == null)
					{
						VectorPOD<ColorVertexData> colorVertexData = new VectorPOD<ColorVertexData>();
						VectorPOD<int> vertexIndexArray = new VectorPOD<int>();

						Create3DDataForLayer(i, colorVertexData, vertexIndexArray, renderInfo);

						layerVertexBuffer[i] = new GCodeVertexBuffer();
						layerVertexBuffer[i].SetVertexData(colorVertexData.Array);
						layerVertexBuffer[i].SetIndexData(vertexIndexArray.Array);
					}
				}

				GL.Disable(EnableCap.Texture2D);
				GL.PushAttrib(AttribMask.EnableBit);
				GL.DisableClientState(ArrayCap.TextureCoordArray);
				GL.Enable(EnableCap.PolygonSmooth);

				if (renderInfo.EndLayerIndex - 1 > renderInfo.StartLayerIndex)
				{
					for (int i = renderInfo.StartLayerIndex; i < renderInfo.EndLayerIndex - 1; i++)
					{
						int featuresOnLayer = renderFeatures[i].Count;
						if (featuresOnLayer > 1)
						{
							layerVertexBuffer[i].renderRange(0, featureEndIndex[i][featuresOnLayer - 1]);
						}
					}
				}

				// draw the partial layer of end-1 from startRatio to endRatio
				{
					int layerIndex = renderInfo.EndLayerIndex - 1;
					int featuresOnLayer = renderFeatures[layerIndex].Count;
					int startFeature = (int)(featuresOnLayer * renderInfo.FeatureToStartOnRatio0To1 + .5);
					startFeature = Math.Max(0, Math.Min(startFeature, featuresOnLayer));

					int endFeature = (int)(featuresOnLayer * renderInfo.FeatureToEndOnRatio0To1 + .5);
					endFeature = Math.Max(0, Math.Min(endFeature, featuresOnLayer));

					// try to make sure we always draw at least one feature
					if (endFeature <= startFeature)
					{
						endFeature = Math.Min(startFeature + 1, featuresOnLayer);
					}
					if (startFeature >= endFeature)
					{
						// This can only happen if the sart and end are set to the last feature
						// Try to set the start feture to one from the end
						startFeature = Math.Max(endFeature - 1, 0);
					}

					if (endFeature > startFeature)
					{
						int ellementCount = featureEndIndex[layerIndex][endFeature - 1] - featureStartIndex[layerIndex][startFeature];

						layerVertexBuffer[layerIndex].renderRange(featureStartIndex[layerIndex][startFeature], ellementCount);
					}
				}
				GL.PopAttrib();
			}
		}
        public void Render3D(GCodeRenderInfo renderInfo)
        {
            if (layerVertexBuffer == null)
            {
                layerVertexBuffer          = new List <GCodeVertexBuffer>();
                layerVertexBuffer.Capacity = gCodeFileToDraw.NumChangesInZ;
                for (int layerIndex = 0; layerIndex < gCodeFileToDraw.NumChangesInZ; layerIndex++)
                {
                    layerVertexBuffer.Add(null);
                    featureStartIndex.Add(new List <int>());
                    featureEndIndex.Add(new List <int>());
                }
            }

            for (int layerIndex = 0; layerIndex < gCodeFileToDraw.NumChangesInZ; layerIndex++)
            {
                CreateFeaturesForLayerIfRequired(layerIndex);
            }

            if (lastRenderType != renderInfo.CurrentRenderType)
            {
                Clear3DGCode();
                lastRenderType = renderInfo.CurrentRenderType;
            }

            if (renderFeatures.Count > 0)
            {
                if (Is32Bit() && !GL.GlHasBufferObjects)
                {
                    int  maxFeaturesForThisSystem = 125000;
                    int  totalFeaturesToRunder    = 0;
                    bool cleanUnusedLayers        = false;
                    // if on 32 bit system make sure we don't run out of memory rendering too many features
                    for (int i = renderInfo.EndLayerIndex - 1; i >= renderInfo.StartLayerIndex; i--)
                    {
                        if (totalFeaturesToRunder + renderFeatures[i].Count < maxFeaturesForThisSystem)
                        {
                            totalFeaturesToRunder += renderFeatures[i].Count;
                        }
                        else                         // don't render any of the layers below this and in fact remove them from memory if possible
                        {
                            renderInfo.startLayerIndex = i + 1;
                            cleanUnusedLayers          = true;
                            break;
                        }
                    }

                    if (cleanUnusedLayers)
                    {
                        // no remove any layers that are set that we are not going to render
                        for (int removeIndex = 0; removeIndex < layerVertexBuffer.Count; removeIndex++)
                        {
                            if (removeIndex < renderInfo.StartLayerIndex || removeIndex >= renderInfo.EndLayerIndex)
                            {
                                if (layerVertexBuffer[removeIndex] != null)
                                {
                                    layerVertexBuffer[removeIndex].Dispose();
                                    layerVertexBuffer[removeIndex] = null;
                                }
                            }
                        }
                    }
                }

                for (int i = renderInfo.EndLayerIndex - 1; i >= renderInfo.StartLayerIndex; i--)
                {
                    // If its the first render or we change what we are trying to render then create vertex data.
                    if (layerVertexBuffer[i] == null)
                    {
                        VectorPOD <ColorVertexData> colorVertexData  = new VectorPOD <ColorVertexData>();
                        VectorPOD <int>             vertexIndexArray = new VectorPOD <int>();

                        Create3DDataForLayer(i, colorVertexData, vertexIndexArray, renderInfo);

                        layerVertexBuffer[i] = new GCodeVertexBuffer();
                        layerVertexBuffer[i].SetVertexData(colorVertexData.Array);
                        layerVertexBuffer[i].SetIndexData(vertexIndexArray.Array);
                    }
                }

                GL.Disable(EnableCap.Texture2D);
                GL.PushAttrib(AttribMask.EnableBit);
                GL.DisableClientState(ArrayCap.TextureCoordArray);
                GL.Enable(EnableCap.PolygonSmooth);

                if (renderInfo.EndLayerIndex - 1 > renderInfo.StartLayerIndex)
                {
                    for (int i = renderInfo.StartLayerIndex; i < renderInfo.EndLayerIndex - 1; i++)
                    {
                        int featuresOnLayer = renderFeatures[i].Count;
                        if (featuresOnLayer > 1)
                        {
                            layerVertexBuffer[i].renderRange(0, featureEndIndex[i][featuresOnLayer - 1]);
                        }
                    }
                }

                // draw the partial layer of end-1 from startRatio to endRatio
                {
                    int layerIndex      = renderInfo.EndLayerIndex - 1;
                    int featuresOnLayer = renderFeatures[layerIndex].Count;
                    int startFeature    = (int)(featuresOnLayer * renderInfo.FeatureToStartOnRatio0To1 + .5);
                    startFeature = Math.Max(0, Math.Min(startFeature, featuresOnLayer));

                    int endFeature = (int)(featuresOnLayer * renderInfo.FeatureToEndOnRatio0To1 + .5);
                    endFeature = Math.Max(0, Math.Min(endFeature, featuresOnLayer));

                    // try to make sure we always draw at least one feature
                    if (endFeature <= startFeature)
                    {
                        endFeature = Math.Min(startFeature + 1, featuresOnLayer);
                    }
                    if (startFeature >= endFeature)
                    {
                        // This can only happen if the start and end are set to the last feature
                        // Try to set the start feature to one from the end
                        startFeature = Math.Max(endFeature - 1, 0);
                    }

                    if (endFeature > startFeature)
                    {
                        int ellementCount = featureEndIndex[layerIndex][endFeature - 1] - featureStartIndex[layerIndex][startFeature];

                        layerVertexBuffer[layerIndex].renderRange(featureStartIndex[layerIndex][startFeature], ellementCount);
                    }
                }
                GL.PopAttrib();
            }
        }