Esempio n. 1
0
    //using the existing point objects, transform their positions and update their tooltips based on the input transformation matrix
    public void TransformPoints(Matrix2x2 transformation)
    {
        if (transformation == null)
        {
            Debug.LogError("Can't transform points with a null transformation matrix.");
            return;
        }

        int numPoints = listOfPoints.Length;

        for (int i = 0; i < numPoints; i++)
        {
            //transform the point
            float   newX             = transformation.a * listOfPoints[i].x + transformation.b * listOfPoints[i].y;
            float   newY             = transformation.c * listOfPoints[i].x + transformation.d * listOfPoints[i].y;
            Vector2 transformedPoint = new Vector2(newX, newY);

            transformedPointPositions[i] = transformedPoint;

            //find and move the object to the point
            Vector3 worldPosition = new Vector3(transformedPoint.x * cartesianToWorldScale[0], transformedPoint.y * cartesianToWorldScale[1], -1);

            pointObjects[i].transform.position = worldPosition;
        }

        //update line positions
        for (int i = 0; i < numPoints; i++)
        {
            RenderPoint renderPoint = pointObjects[i].GetComponent <RenderPoint>();
            renderPoint.UpdateLine();
        }

        AdjustZoom();
        UpdatePointTooltips();
    }
Esempio n. 2
0
        /// <summary>
        /// A Texture2D with coords relative to the screen. Generates the center of the 
        /// texture as well.
        /// </summary>
        /// <param name="tex">A delegate that returns a Texture2D.</param>
        /// <param name="position">Position of texture. Defined by point; e.g. if point is Center this value will be the center of the texture.</param>
        /// <param name="renderBox">If using a compiled texture, the rectangle that contains the
        /// desired texture. Use null for all of the given texture.</param>
        /// <param name="point">This is the point at which to render the sprite.</param>
        public Sprite(TextureDelegate d, Vector2 position, Rectangle? renderBox, RenderPoint point)
        {
            textureDelegate = d;
            if(renderBox.HasValue)
                TargetArea = renderBox.Value;
            else
                TargetArea = new Rectangle(0, 0, Texture.Width, Texture.Height);
            Point = point;

            if(point == RenderPoint.UpLeft)
            {
                upperLeft = position;
                lowerRight = new Vector2(upperLeft.X + Width, upperLeft.Y + Height);
                center = new Vector2((upperLeft.X + lowerRight.X) * 0.5f, (upperLeft.Y + lowerRight.Y) * 0.5f);
            }
            else // center
            {
                center = position;
                lowerRight = new Vector2(center.X + TargetArea.Width * 0.5f, center.Y + TargetArea.Height * 0.5f);
                upperLeft = new Vector2(center.X - TargetArea.Width * 0.5f, center.Y - TargetArea.Height * 0.5f);
                relativeOrigin = new Vector2(TargetArea.Width * 0.5f, TargetArea.Height * 0.5f);
            }

            originalCenter = Center;
            relativeScreenPosition = new Vector2(upperLeft.X / RenderingDevice.Width, upperLeft.Y / RenderingDevice.Height);

            RenderingDevice.GDM.DeviceReset += rebuildCenters;
        }
Esempio n. 3
0
        public bool IsPointInTriangleFace2(RenderPoint point)
        {
            var v0 = this.Vertexes[0].Position;
            var v1 = this.Vertexes[1].Position;
            var v2 = this.Vertexes[2].Position;

            if (Math.Abs(this.Face.Normal.Z) > Constants.Epsilon)
            {
                var s = Square(point.Position.X, point.Position.Y, v0.X, v0.Y, v1.X, v1.Y) +
                        Square(point.Position.X, point.Position.Y, v1.X, v1.Y, v2.X, v2.Y) +
                        Square(point.Position.X, point.Position.Y, v2.X, v2.Y, v0.X, v0.Y);
                return(Math.Abs(Square(v0.X, v0.Y, v1.X, v1.Y, v2.X, v2.Y) - s) <= Constants.EpsilonDouble);
            }
            else if (Math.Abs(this.Face.Normal.X) > Constants.Epsilon)
            {
                var s = Square(point.Position.Z, point.Position.Y, v0.Z, v0.Y, v1.Z, v1.Y) +
                        Square(point.Position.Z, point.Position.Y, v1.Z, v1.Y, v2.Z, v2.Y) +
                        Square(point.Position.Z, point.Position.Y, v2.Z, v2.Y, v0.Z, v0.Y);
                return(Math.Abs(Square(v0.Z, v0.Y, v1.Z, v1.Y, v2.Z, v2.Y) - s) <= Constants.EpsilonDouble);
            }
            else
            {
                var s = Square(point.Position.X, point.Position.Z, v0.X, v0.Z, v1.X, v1.Z) +
                        Square(point.Position.X, point.Position.Z, v1.X, v1.Z, v2.X, v2.Z) +
                        Square(point.Position.X, point.Position.Z, v2.X, v2.Z, v0.X, v0.Z);
                return(Math.Abs(Square(v0.X, v0.Z, v1.X, v1.Z, v2.X, v2.Z) - s) <= Constants.EpsilonDouble);
            }
        }
Esempio n. 4
0
        public bool IsPointInTriangleFace(RenderPoint point)
        {
            var v0 = this.Vertexes[0].Position;
            var v1 = this.Vertexes[1].Position;
            var v2 = this.Vertexes[2].Position;

            if (this.Face.Normal.Z != 0)
            {
                var q1 = Q(v0.X, v0.Y, v1.X, v1.Y, point.Position.X, point.Position.Y);
                var q2 = Q(v1.X, v1.Y, v2.X, v2.Y, point.Position.X, point.Position.Y);
                var q3 = Q(v2.X, v2.Y, v0.X, v0.Y, point.Position.X, point.Position.Y);
                return(((q1 >= 0) && (q2 >= 0) && (q3 >= 0)) || ((q1 < 0) && (q2 < 0) && (q3 < 0)));
            }
            else if (this.Face.Normal.X != 0)
            {
                var q1 = Q(v0.Z, v0.Y, v1.Z, v1.Y, point.Position.Z, point.Position.Y);
                var q2 = Q(v1.Z, v1.Y, v2.Z, v2.Y, point.Position.Z, point.Position.Y);
                var q3 = Q(v2.Z, v2.Y, v0.Z, v0.Y, point.Position.Z, point.Position.Y);
                return(((q1 >= 0) && (q2 >= 0) && (q3 >= 0)) || ((q1 < 0) && (q2 < 0) && (q3 < 0)));
            }
            else
            {
                var q1 = Q(v0.X, v0.Z, v1.X, v1.Z, point.Position.X, point.Position.Z);
                var q2 = Q(v1.X, v1.Z, v2.X, v2.Z, point.Position.X, point.Position.Z);
                var q3 = Q(v2.X, v2.Z, v0.X, v0.Z, point.Position.X, point.Position.Z);
                return(((q1 >= 0) && (q2 >= 0) && (q3 >= 0)) || ((q1 < 0) && (q2 < 0) && (q3 < 0)));
            }
        }
Esempio n. 5
0
    //update each point to create the lines that connect points together
    private void GivePointObjectsLineData()
    {
        if (lineConnections == null)
        {
            Debug.Log("Won't connect lines with no line connections to make.");
            return;
        }

        for (int i = 0; i < lineConnections.Length; i++)
        {
            int pointA = lineConnections[i].x;
            int pointB = lineConnections[i].y;

            if (pointA < pointObjects.Length && pointB < pointObjects.Length)
            {
                RenderPoint renderPointA = pointObjects[pointA].GetComponent <RenderPoint>();
                RenderPoint renderPointB = pointObjects[pointB].GetComponent <RenderPoint>();

                if (renderPointA != null && renderPointB != null)
                {
                    renderPointA.AssignNextPointInLine(renderPointB);
                }
                else
                {
                    print("While trying to render a line, could not find RenderPoint components on instantiated point objects.");
                }
            }
            else
            {
                print("Can't render a line between points " + pointA + " and " + pointB + ".");
            }
        }
    }
        void IGraphicsDriver.RenderCharacter(RenderPoint point, RenderSize size, byte flags, byte[] pixels, int pixelsHeight, int pixelsWidth)
        {
            int fontScaleX = (this.displayScaleX * size.Width) / pixelsWidth;
            int fontScaleY = (this.displayScaleY * size.Height) / pixelsHeight;

            SDL_Surface surface = (SDL_Surface)Marshal.PtrToStructure(this.surfacePtr, typeof(SDL_Surface));

            for (int i = 0; i < pixelsWidth; i++)
            {
                int positionX = (point.X * this.displayScaleX) + (i * fontScaleX);

                for (int j = 0; j < pixelsHeight; j++)
                {
                    int positionY = (point.Y * this.displayScaleY) + (j * fontScaleY);

                    byte pixel = pixels[(j * pixelsWidth) + i];

                    for (int deltaY = 0; deltaY < fontScaleY; deltaY++)
                    {
                        for (int deltaX = 0; deltaX < fontScaleX; deltaX++)
                        {
                            Marshal.WriteByte(new IntPtr(surface.pixels.ToInt32() + ((positionY + deltaY) * surface.pitch) + (positionX + deltaX)), pixel);
                        }
                    }
                }
            }
        }
Esempio n. 7
0
        public double[] GetBarycentricCoordinates_Old(RenderPoint point)
        {
            var v0 = this.Vertexes[0].Position;
            var v1 = this.Vertexes[1].Position;
            var v2 = this.Vertexes[2].Position;

            var result = new double[3];

            if (Math.Abs(this.Face.Normal.Z) > Constants.Epsilon)
            {
                var area = Square(v0.X, v0.Y, v1.X, v1.Y, v2.X, v2.Y);
                result[0] = Square(point.Position.X, point.Position.Y, v0.X, v0.Y, v1.X, v1.Y) / area;
                result[1] = Square(point.Position.X, point.Position.Y, v1.X, v1.Y, v2.X, v2.Y) / area;
                result[2] = 1 - result[0] - result[1];
                return(result);
            }
            else if (Math.Abs(this.Face.Normal.X) > Constants.Epsilon)
            {
                var area = Square(v0.Z, v0.Y, v1.Z, v1.Y, v2.Z, v2.Y);
                result[0] = Square(point.Position.Z, point.Position.Y, v0.Z, v0.Y, v1.Z, v1.Y) / area;
                result[1] = Square(point.Position.Z, point.Position.Y, v1.Z, v1.Y, v2.Z, v2.Y) / area;
                result[2] = 1 - result[0] - result[1];
                return(result);
            }
            else
            {
                var area = Square(v0.X, v0.Z, v1.X, v1.Z, v2.X, v2.Z);
                result[0] = Square(point.Position.X, point.Position.Z, v0.X, v0.Z, v1.X, v1.Z) / area;
                result[1] = Square(point.Position.X, point.Position.Z, v1.X, v1.Z, v2.X, v2.Z) / area;
                result[2] = 1 - result[0] - result[1];
                return(result);
            }
        }
Esempio n. 8
0
 public RenderPoint(int screenX, int screenY, Intersection intersection, Vector direction, bool isPrimaryPoint)
     : base(intersection, direction)
 {
     this.ScreenX             = screenX;
     this.ScreenY             = screenY;
     this.IsPrimaryPoint      = isPrimaryPoint;
     this.IlluminanceDirect   = new Spectrum();
     this.IlluminanceIndirect = new Spectrum();
     this.Index = RenderPoint.GetIndex();
 }
Esempio n. 9
0
        /// <summary>
        /// 沿中心点展开一个范围指示器
        /// </summary>
        /// <param name="center">中心点</param>
        /// <param name="expandWidth">展开范围</param>
        public void ExpandAera(Vector2 center, int expandWidth)
        {
            List <Vector2> list = Navigation.ExpandAera(center, expandWidth, Navigation.CanMoveInPhysics);

            GameObject.InitMesh(list);

            RenderPoint rp = new RenderPoint("  ", Destroy.Color.Blue, Destroy.Color.Blue, (int)Layer.MoveAera);

            renderer.Rendering(rp);
        }
Esempio n. 10
0
        /// <summary>
        /// 沿路径展开一个路径指示器
        /// </summary>
        /// <param name="beginPos">起点</param>
        /// <param name="endPos">终点</param>
        public void SearchRoute(Vector2 beginPos, Vector2 endPos)
        {
            List <Vector2> list = Navigation.Search(beginPos, endPos).ResultList;

            GameObject.InitMesh(list);

            RenderPoint rp = new RenderPoint("  ", Config.DefaultForeColor, Destroy.Color.Green, (int)Layer.MoveRoute);

            renderer.Rendering(rp);
        }
Esempio n. 11
0
        /// <summary>
        /// 创建地图对象
        /// </summary>
        public static GameObject CreateWall(List <Vector2> list)
        {
            GameObject gameObject = new GameObject("Wall", "Wall");

            gameObject.InitMesh(list);
            var renderer = gameObject.AddComponent <Renderer>();

            RenderPoint rp = new RenderPoint("■", Color.White, Config.DefaultBackColor, (int)Layer.Environment);

            renderer.Rendering(rp);

            gameObject.AddComponent <Collider>();
            return(gameObject);
        }
Esempio n. 12
0
        public double[] GetBarycentricCoordinates(RenderPoint point)
        {
            var l01 = (this.Vertexes[0].Position - this.Vertexes[1].Position).Length;
            var l12 = (this.Vertexes[1].Position - this.Vertexes[2].Position).Length;
            var l20 = (this.Vertexes[2].Position - this.Vertexes[0].Position).Length;

            var lp0 = (point.Position - this.Vertexes[0].Position).Length;
            var lp1 = (point.Position - this.Vertexes[1].Position).Length;
            var lp2 = (point.Position - this.Vertexes[2].Position).Length;

            var area = Math3D.TriangleAreaByGeron(l01, l12, l20);

            var a01 = Math3D.TriangleAreaByGeron(l01, lp0, lp1) / area;
            var a12 = Math3D.TriangleAreaByGeron(l12, lp1, lp2) / area;

            return(new double[] { a01, a12, 1 - a01 - a12 });
        }
Esempio n. 13
0
        public static RenderPoint GetNearestRenderPoint(IEnumerable <RenderPoint> renderPoints, Point3D point)
        {
            RenderPoint result  = null;
            var         length2 = float.MaxValue;

            foreach (var renderPoint in renderPoints)
            {
                var tmp = (renderPoint.Position - point).Length2;
                if (tmp < length2)
                {
                    length2 = tmp;
                    result  = renderPoint;
                }
            }

            return(result);
        }
Esempio n. 14
0
    //update each point's tooltip with text describing the point's position, and set whether its tool tip should be enabled or not
    private void UpdatePointTooltips()
    {
        if (pointObjects == null)
        {
            Debug.LogError("Can't update tooltips when no point objects exist.");
            return;
        }
        //Debug.Log("Updating the tool tips for each point.");
        int numPoints = pointObjects.Length;

        for (int i = 0; i < numPoints; i++)
        {
            RenderPoint renderPoint = pointObjects[i].GetComponent <RenderPoint>();
            renderPoint.ChangeText("(" + transformedPointPositions[i].x.ToString("0.0") + ", " + transformedPointPositions[i].y.ToString("0.0") + " )");
            renderPoint.TooltipEnabled = showCoordinates;
            renderPoint.SetToolTipSize(toolTipRenderSize);
        }
    }
Esempio n. 15
0
        /// <summary>
        /// Returns a value indicating whether this instance and a specified Object represent the same type and value.
        /// </summary>
        /// <param name="obj">An object to compare to this instance.</param>
        /// <returns>true if obj is the same type and value; otherwise, false. </returns>
        public override bool Equals(object obj)
        {
            if (obj != null)
            {
                RenderPoint o = (RenderPoint)obj;

                if (this.X != o.X)
                {
                    return(false);
                }

                if (this.Y != o.Y)
                {
                    return(false);
                }

                return(true);
            }

            return(false);
        }
Esempio n. 16
0
		public void DrawTo(Graphics2D graphics2D, Mesh meshToDraw, RGBA_Bytes partColorIn, double minZ, double maxZ)
		{
			RGBA_Floats partColor = partColorIn.GetAsRGBA_Floats();
			graphics2D.Rasterizer.gamma(new gamma_power(.3));
			RenderPoint[] points = new RenderPoint[3] { new RenderPoint(), new RenderPoint(), new RenderPoint() };

			foreach (Face face in meshToDraw.Faces)
			{
				int i = 0;
				Vector3 normal = Vector3.TransformVector(face.normal, trackballTumbleWidget.ModelviewMatrix).GetNormal();
				if (normal.z > 0)
				{
					foreach (FaceEdge faceEdge in face.FaceEdges())
					{
						points[i].position = trackballTumbleWidget.GetScreenPosition(faceEdge.firstVertex.Position);

						Vector3 transformedPosition = Vector3.TransformPosition(faceEdge.firstVertex.Position, trackballTumbleWidget.ModelviewMatrix);
						points[i].z = transformedPosition.z;
						i++;
					}

					RGBA_Floats polyDrawColor = new RGBA_Floats();
					double L = Vector3.Dot(lightNormal, normal);
					if (L > 0.0f)
					{
						polyDrawColor = partColor * lightIllumination * L;
					}

					polyDrawColor = RGBA_Floats.ComponentMax(polyDrawColor, partColor * ambiantIllumination);
					for (i = 0; i < 3; i++)
					{
						double ratio = (points[i].z - minZ) / (maxZ - minZ);
						int ratioInt16 = (int)(ratio * 65536);
						points[i].color = new RGBA_Bytes(polyDrawColor.Red0To255, ratioInt16 >> 8, ratioInt16 & 0xFF);
					}


#if true
					scanline_unpacked_8 sl = new scanline_unpacked_8();
					ScanlineRasterizer ras = new ScanlineRasterizer();
					render_gouraud(graphics2D.DestImage, sl, ras, points);
#else
					IRecieveBlenderByte oldBlender = graphics2D.DestImage.GetRecieveBlender();
					graphics2D.DestImage.SetRecieveBlender(new BlenderZBuffer());
					graphics2D.Render(polygonProjected, renderColor);
					graphics2D.DestImage.SetRecieveBlender(oldBlender);
#endif

					byte[] buffer = graphics2D.DestImage.GetBuffer();
					int pixels = graphics2D.DestImage.Width * graphics2D.DestImage.Height;
					for (int pixelIndex = 0; pixelIndex < pixels; pixelIndex++)
					{
						buffer[pixelIndex * 4 + ImageBuffer.OrderR] = buffer[pixelIndex * 4 + ImageBuffer.OrderR];
						buffer[pixelIndex * 4 + ImageBuffer.OrderG] = buffer[pixelIndex * 4 + ImageBuffer.OrderR];
						buffer[pixelIndex * 4 + ImageBuffer.OrderB] = buffer[pixelIndex * 4 + ImageBuffer.OrderR];
					}
				}
			}
		}
Esempio n. 17
0
		internal void render_gouraud(IImageByte backBuffer, IScanlineCache sl, IRasterizer ras, RenderPoint[] points)
		{
			ImageBuffer image = new ImageBuffer();
			image.Attach(backBuffer, new BlenderZBuffer());

			ImageClippingProxy ren_base = new ImageClippingProxy(image);

			MatterHackers.Agg.span_allocator span_alloc = new span_allocator();
			span_gouraud_rgba span_gen = new span_gouraud_rgba();

			span_gen.colors(points[0].color, points[1].color, points[2].color);
			span_gen.triangle(points[0].position.x, points[0].position.y, points[1].position.x, points[1].position.y, points[2].position.x, points[2].position.y);
			ras.add_path(span_gen);
			ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
			scanlineRenderer.GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);
		}
Esempio n. 18
0
        void IGraphicsDriver.RenderToScreen(RenderBuffer buffer, int offsetYRenderPoints, RenderPoint topLeft, RenderPoint bottomRight, bool fade)
        {
            // all these coordinates are in render buffer coordinates (320x200 or 640x400)
            byte[,] bytes = buffer.GetBuffer();

            SDL_Surface surface = (SDL_Surface)Marshal.PtrToStructure(this.surfacePtr, typeof(SDL_Surface));

            if (!fade)
            {
                for (int j = topLeft.Y; j < bottomRight.Y; j++)
                {
                    int positionY = (offsetYRenderPoints + j) * this.displayScaleY;

                    for (int i = topLeft.X; i < bottomRight.X; i++)
                    {
                        byte pixel = bytes[i, j];

                        int positionX = i * this.displayScaleX;

                        for (int deltaY = 0; deltaY < this.displayScaleY; deltaY++)
                        {
                            for (int deltaX = 0; deltaX < this.displayScaleX; deltaX++)
                            {
                                Marshal.WriteByte(new IntPtr(surface.pixels.ToInt32() + ((positionY + deltaY) * surface.pitch) + (positionX + deltaX)), pixel);
                            }
                        }
                    }
                }

                var rects = new SDL_Rect[]
                {
                    new SDL_Rect()
                    {
                        x = topLeft.X * this.displayScaleX,
                        y = (topLeft.Y + offsetYRenderPoints) * this.displayScaleY,
                        w = (bottomRight.X - topLeft.X) * this.displayScaleX,
                        h = (bottomRight.Y - topLeft.Y) * this.displayScaleY,
                    }
                };

                SDL_UpdateWindowSurfaceRects(this.windowPtr, rects, rects.Length);
            }
            else
            {
                const int Delay    = 50;
                byte[][]  fadeBits = new byte[][]
                {
                    new byte[] { 0, 11, 7, 15 },
                    new byte[] { 8, 4, 1, 12 },
                    new byte[] { 14, 2, 9, 5 },
                    new byte[] { 10, 6, 13, 3 },
                };

                for (int fadeCount = 0; fadeCount < 16; fadeCount++)
                {
                    for (int j = topLeft.Y; j < bottomRight.Y; j++)
                    {
                        int positionY = (offsetYRenderPoints + j) * this.displayScaleY;

                        for (int i = topLeft.X; i < bottomRight.X; i++)
                        {
                            if (fadeBits[i % 4][j % 4] == fadeCount)
                            {
                                byte pixel = bytes[i, j];

                                int positionX = i * this.displayScaleX;

                                for (int deltaY = 0; deltaY < this.displayScaleY; deltaY++)
                                {
                                    for (int deltaX = 0; deltaX < this.displayScaleX; deltaX++)
                                    {
                                        Marshal.WriteByte(new IntPtr(surface.pixels.ToInt32() + ((positionY + deltaY) * surface.pitch) + (positionX + deltaX)), pixel);
                                    }
                                }
                            }
                        }
                    }

                    var rects = new SDL_Rect[]
                    {
                        new SDL_Rect()
                        {
                            x = topLeft.X * this.displayScaleX,
                            y = (topLeft.Y + offsetYRenderPoints) * this.displayScaleY,
                            w = (bottomRight.X - topLeft.X) * this.displayScaleX,
                            h = (bottomRight.Y - topLeft.Y) * this.displayScaleY,
                        }
                    };

                    SDL_UpdateWindowSurfaceRects(this.windowPtr, rects, rects.Length);

                    SDL_Delay(Delay);
                }
            }

            var src = new SDL_Rect()
            {
                x = topLeft.X * this.displayScaleX,
                y = (topLeft.Y + offsetYRenderPoints) * this.displayScaleY,
                w = (bottomRight.X - topLeft.X) * this.displayScaleX,
                h = (bottomRight.Y - topLeft.Y) * this.displayScaleY,
            };

            SDL_RenderCopy(this.rendererPtr, this.texturePtr, ref src, ref src);
            SDL_RenderPresent(this.rendererPtr);
        }
Esempio n. 19
0
        public RenderPointsStructure GenerateRenderPoints(ICamera camera, int width, int height)
        {
            var tick   = Environment.TickCount;
            var result = new RenderPointsStructure(this.Scene, width, height);

            this.Log.Message(string.Format("Start generationg render points. Estimated count {0}", width * height));

            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    Ray ray = camera.GetTracingRay(x, y, width, height);

                    var intersection = this.RayTracer.Trace(ray.From, ray.Direction);
                    if (intersection == null)
                    {
                        continue;
                    }

                    // выбраковка не лицевых граней
                    var cosa = Vector.Dot(ray.Direction, intersection.Face.Normal);
                    if (cosa > 0)
                    {
                        continue;
                    }

                    var renderPoint = new RenderPoint(x, y, intersection, ray.Direction * -1f, true);
                    result.Add(renderPoint);

                    // материал зеркальный
                    var currentRenderPoint = renderPoint;
                    int iteration          = 0;
                    while (intersection.Face.Material.Mirror != null)
                    {
                        var reflectedRayDirection = ray.Direction.Reflect(intersection.Face.Normal);
                        ray = new Ray(intersection.Point, reflectedRayDirection);

                        //if ( rand.Next(100) == 50 )
                        //    RayDebugStaticCollection.Add( new Ray( intersection.Point, reflectedRayDirection ), Color.Red );

                        intersection = this.RayTracer.Trace(ray.From, ray.Direction, Constants.Epsilon);
                        if (intersection == null)
                        {
                            break;
                        }

                        var mirrorRenderPoint = new RenderPoint(x, y, intersection, ray.Direction * -1f, false);
                        result.Add(mirrorRenderPoint);
                        currentRenderPoint.MirrorRenderPoint = mirrorRenderPoint;
                        currentRenderPoint = mirrorRenderPoint;
                        iteration++;
                        if (iteration > 5)
                        {
                            break;
                        }
                    }
                }
            }

            if (this.Log != null)
            {
                tick = Environment.TickCount - tick;
                Log.Message(string.Format("GetRenderPoints: Rays = {0}, Time = {1} s", result.RenderPoints.Count, (float)tick / 1000));
            }

            return(result);
        }
Esempio n. 20
0
        /// <summary>
        /// 预加载缓存
        /// </summary>
        public static void PreDraw()
        {
            if (renderList.Count == 0)
            {
                return;
            }

            lock (renderList)
            {
                bufferbuffer.Clear();
                foreach (var v in renderList)
                {
                    bufferbuffer.Add(v);
                }
            }


            Graphics g;

            if (firstLoad)
            {
                bufferBitmap = new Bitmap(Config.WindowsSize.X, Config.WindowsSize.Y);

                g = Graphics.FromImage(bufferBitmap);
                g.FillRectangle(new SolidBrush(Config.DefaultBackColor.ToColor()),
                                new RectangleF(new Point(0, 0), new SizeF(Config.WindowsSize.X, Config.WindowsSize.Y)));
                foreach (var r in bufferbuffer)
                {
                    buffer.Add(new RenderPoint());
                }
                firstLoad = false;
            }

            g = Graphics.FromImage(bufferBitmap);

            //初始化刷子
            SolidBrush solidBrushFore = new SolidBrush(Config.DefaultForeColor.ToColor());
            SolidBrush solidBrushBack = new SolidBrush(Config.DefaultBackColor.ToColor());

            #region 可能用到的font
            //这个字体制表符是占两位的..... 新宋体的制表符占2位,显示可能有点问题
            //if (CharUtils.IsTabChar(rp.Str[0]))
            //{
            //    font = new Font("Consolas", 12, FontStyle.Bold);
            //}
            //else
            //{

            //    font = new Font("新宋体", 12, FontStyle.Bold);
            //}
            #endregion
            //初始化字体
            Font fontCn = new Font("新宋体", 12, FontStyle.Bold);
            Font fontEn = new Font("Courier New", 12, FontStyle.Bold);

            #region 非双缓冲模式

            /*
             * for (int i = 0; i < drawList.Count; i++)
             * {
             *  //如果是单个汉字的话,那么直接跳过第二个字符的渲染
             *  if (i > 0 && CharUtils.GetCharWidth(drawList[i - 1].Str[0]) == 2)
             *  {
             *      continue;
             *  }
             *  RenderPoint rp = drawList[i];
             *
             *  solidBrushFore.Color = rp.ForeColor.ToColor();
             *  solidBrushBack.Color = rp.BackColor.ToColor();
             *
             *  int pixelX = i % (Config.ScreenWidth * (int)Config.CharWidth) * Config.RendererSize.X / 2;
             *  int pixelY = i / (Config.ScreenWidth * (int)Config.CharWidth) * Config.RendererSize.Y;
             *  //DebugLog(new Vector2Int(pixelX, pixelY).ToString());
             *  Point point = new Point(pixelX, pixelY);
             *
             *  g.FillRectangle(solidBrushBack, new RectangleF(new Point(point.X + 4, point.Y),
             *      new SizeF(Config.RendererSize.X, Config.RendererSize.Y)));
             *  g.DrawString(rp.Str, font, solidBrushFore, point);
             * }
             */
            #endregion


            diffIndex = new List <int>();

            //挑出不同的点
            for (int i = 0; i < bufferbuffer.Count; i++)
            {
                if (!buffer[i].Equals(bufferbuffer[i]))
                {
                    diffIndex.Add(i);
                }
            }


            foreach (int index in diffIndex)
            {
                RenderPoint rp = bufferbuffer[index];

                solidBrushFore.Color = rp.ForeColor.ToColor();
                solidBrushBack.Color = rp.BackColor.ToColor();

                int pixelX = index % (Config.ScreenWidth) * Config.RendererSize.X;
                int pixelY = index / (Config.ScreenWidth) * Config.RendererSize.Y;
                //DebugLog(new Vector2Int(pixelX, pixelY).ToString());
                Point point = new Point(pixelX, pixelY);

                g.FillRectangle(solidBrushBack, new RectangleF(new Point(point.X + 3, point.Y),
                                                               new SizeF(Config.RendererSize.X, Config.RendererSize.Y)));
                //if (CharUtils.GetCharWidth(rp.Str[0]) == 2)
                if (rp.Str.Length == 1)
                {
                    g.DrawString(rp.Str, fontCn, solidBrushFore, point);
                }
                else
                {
                    g.DrawString(rp.Str[0].ToString(), fontEn, solidBrushFore, point);
                    g.DrawString(rp.Str[1].ToString(), fontEn, solidBrushFore, new Point(pixelX + 8, pixelY));
                }
            }

            //复制缓存
            for (int i = 0; i < bufferbuffer.Count; i++)
            {
                buffer[i] = bufferbuffer[i];
            }
            EditorSystem.PreRenderCount++;
        }
Esempio n. 21
0
    protected override void SetModel()
    {
        if (transform.childCount == 0)
        {
            GameObject model;

            bool            createSpriteLOD = false;
            LODRegisterInfo regInfo         = new LODRegisterInfo(0, 0, 0);
            float           height          = 0;
            switch (model_id)
            {
            case ContainerModelType.DeadLifestone:
            {
                model = Instantiate(Resources.Load <GameObject>("Structures/LifeStone"));
                Destroy(model.transform.GetChild(0).gameObject);
                Destroy(model.transform.GetChild(1).gameObject);
                MeshRenderer[] mrrs = model.GetComponentsInChildren <MeshRenderer>();
                foreach (MeshRenderer mr in mrrs)
                {
                    mr.sharedMaterial = PoolMaster.GetMaterial(MaterialType.Basic);
                }
                break;
            }

            case ContainerModelType.DeadTreeOfLife:
            {
                model = Instantiate(Resources.Load <GameObject>("Lifeforms/deadTreeOfLife"));
                break;
            }

            case ContainerModelType.DeadOak4:
            {
                model           = Instantiate(Resources.Load <GameObject>("Lifeforms/oak-4_dead"));
                createSpriteLOD = true;
                regInfo         = new LODRegisterInfo(LODController.CONTAINER_MODEL_ID, (int)ContainerModelType.DeadOak4, 0);
                height          = 0.211f;
                break;
            }

            case ContainerModelType.DeadOak5:
            {
                model           = Instantiate(Resources.Load <GameObject>("Lifeforms/oak-6_dead"));
                createSpriteLOD = true;
                regInfo         = new LODRegisterInfo(LODController.CONTAINER_MODEL_ID, (int)ContainerModelType.DeadOak5, 0);
                height          = 0.211f;
                break;
            }

            case ContainerModelType.DeadOak6:
            {
                model           = Instantiate(Resources.Load <GameObject>("Lifeforms/oak-6_dead"));
                createSpriteLOD = true;
                regInfo         = new LODRegisterInfo(LODController.CONTAINER_MODEL_ID, (int)ContainerModelType.DeadOak6, 0);
                height          = 0.211f;
                break;
            }

            case ContainerModelType.Pile:
            {
                model = Instantiate(Resources.Load <GameObject>("Prefs/pilePref"));

                createSpriteLOD = true;
                regInfo         = new LODRegisterInfo((int)ContainerModelType.Pile, 0, mainResource.ID);
                height          = 0.047f;

                Transform meshTransform = model.transform.GetChild(0);
                var       mf            = meshTransform.GetComponent <MeshFilter>();
                var       mr            = meshTransform.GetComponent <MeshRenderer>();
                PoolMaster.SetMaterialByID(
                    ref mf,
                    ref mr,
                    mainResource.ID,
                    255
                    );
                break;
            }

            case ContainerModelType.BerryBush:
            {
                model = Instantiate(Resources.Load <GameObject>("Prefs/berryBush"));
                //if (PoolMaster.shadowCasting) PoolMaster.ReplaceMaterials(model, true);
                break;
            }

            case ContainerModelType.Boulder:
            {
                model = Instantiate(Resources.Load <GameObject>("Prefs/boulderPref"));
                Transform meshTransform = model.transform.GetChild(0);
                var       mf            = meshTransform.GetComponent <MeshFilter>();
                var       mr            = meshTransform.GetComponent <MeshRenderer>();
                PoolMaster.SetMaterialByID(
                    ref mf,
                    ref mr,
                    mainResource.ID,
                    255
                    );

                regInfo         = new LODRegisterInfo((int)ContainerModelType.Boulder, 0, mainResource.ID);
                createSpriteLOD = true;
                height          = 0.047f;
                break;
            }

            default:
            {
                model = Instantiate(Resources.Load <GameObject>("Prefs/defaultContainer"));
                Transform meshTransform = model.transform.GetChild(0);
                var       mf            = meshTransform.GetComponent <MeshFilter>();
                var       mr            = meshTransform.GetComponent <MeshRenderer>();
                PoolMaster.SetMaterialByID(
                    ref mf,
                    ref mr,
                    mainResource.ID,
                    255
                    );
                break;
            }
            }

            if (createSpriteLOD)
            {
                SpriteRenderer sr = new GameObject("lod").AddComponent <SpriteRenderer>();
                sr.transform.parent        = model.transform;
                sr.transform.localPosition = Vector3.up * height;
                sr.sharedMaterial          = !PoolMaster.useDefaultMaterials ? PoolMaster.billboardShadedMaterial : PoolMaster.billboardMaterial;
                if (PoolMaster.shadowCasting)
                {
                    sr.receiveShadows = true;
                }
                LODController currentLC         = LODController.GetCurrent();
                LODPackType   lpackType         = LODPackType.Point;
                int           indexInRegistered = currentLC.LOD_existanceCheck(regInfo);

                if (indexInRegistered == -1)
                {
                    int           resolution      = 8;
                    float         size            = 0.05f;
                    Color         backgroundColor = Color.gray;
                    RenderPoint[] renderpoints    = new RenderPoint[] { };

                    switch (model_id)
                    {
                    case ContainerModelType.Pile:
                    {
                        renderpoints = new RenderPoint[] { new RenderPoint(new Vector3(0, 0.084f, -0.063f), new Vector3(45, 0, 0)) };
                        break;
                    }

                    case ContainerModelType.Boulder:
                    {
                        renderpoints = new RenderPoint[] { new RenderPoint(new Vector3(0, 0.084f, -0.063f), new Vector3(45, 0, 0)) };
                        break;
                    }

                    case ContainerModelType.DeadOak4:
                    {
                        renderpoints = new RenderPoint[] {
                            new RenderPoint(new Vector3(0, 0.222f, -0.48f), Vector3.zero),
                            new RenderPoint(new Vector3(0, 0.479f, -0.434f), new Vector3(30, 0, 0)),
                            new RenderPoint(new Vector3(0, 0.458f, -0.232f), new Vector3(45, 0, 0)),
                            new RenderPoint(new Vector3(0, 0.551f, -0.074f), new Vector3(75, 0, 0))
                        };
                        size       = 0.2f;
                        resolution = 32;
                        lpackType  = LODPackType.OneSide;
                        break;
                    }

                    case ContainerModelType.DeadOak5:
                    {
                        renderpoints = new RenderPoint[] {
                            new RenderPoint(new Vector3(0, 0.222f, -0.48f), Vector3.zero),
                            new RenderPoint(new Vector3(0, 0.479f, -0.434f), new Vector3(30, 0, 0)),
                            new RenderPoint(new Vector3(0, 0.458f, -0.232f), new Vector3(45, 0, 0)),
                            new RenderPoint(new Vector3(0, 0.551f, -0.074f), new Vector3(75, 0, 0))
                        };
                        size       = 0.25f;
                        resolution = 32;
                        lpackType  = LODPackType.OneSide;
                        break;
                    }

                    case ContainerModelType.DeadOak6:
                    {
                        renderpoints = new RenderPoint[] {
                            new RenderPoint(new Vector3(0, 0.222f, -0.48f), Vector3.zero),
                            new RenderPoint(new Vector3(0, 0.479f, -0.434f), new Vector3(30, 0, 0)),
                            new RenderPoint(new Vector3(0, 0.458f, -0.232f), new Vector3(45, 0, 0)),
                            new RenderPoint(new Vector3(0, 0.551f, -0.074f), new Vector3(75, 0, 0))
                        };
                        size       = 0.4f;
                        resolution = 64;
                        lpackType  = LODPackType.OneSide;
                        break;
                    }
                    }

                    indexInRegistered = LODSpriteMaker.current.CreateLODPack(lpackType, model, renderpoints, resolution, size, backgroundColor, regInfo);
                }
                model.transform.parent        = transform;
                model.transform.localPosition = Vector3.zero;
                model.transform.localRotation = Quaternion.Euler(Vector3.zero);
                lodComponent = currentLC.SetInControl(basement, model.transform.GetChild(0).gameObject, sr, indexInRegistered);
            }
            else
            {
                model.transform.parent        = transform;
                model.transform.localPosition = Vector3.zero;
                model.transform.localRotation = Quaternion.Euler(Vector3.zero);
            }
        }
    }
Esempio n. 22
0
        public void DrawTo(Graphics2D graphics2D, Mesh meshToDraw, RGBA_Bytes partColorIn, double minZ, double maxZ)
        {
            RGBA_Floats partColor = partColorIn.GetAsRGBA_Floats();

            graphics2D.Rasterizer.gamma(new gamma_power(.3));
            RenderPoint[] points = new RenderPoint[3] {
                new RenderPoint(), new RenderPoint(), new RenderPoint()
            };

            foreach (Face face in meshToDraw.Faces)
            {
                int     i      = 0;
                Vector3 normal = Vector3.TransformVector(face.normal, trackballTumbleWidget.ModelviewMatrix).GetNormal();
                if (normal.z > 0)
                {
                    foreach (FaceEdge faceEdge in face.FaceEdges())
                    {
                        points[i].position = trackballTumbleWidget.GetScreenPosition(faceEdge.firstVertex.Position);

                        Vector3 transformedPosition = Vector3.TransformPosition(faceEdge.firstVertex.Position, trackballTumbleWidget.ModelviewMatrix);
                        points[i].z = transformedPosition.z;
                        i++;
                    }

                    RGBA_Floats polyDrawColor = new RGBA_Floats();
                    double      L             = Vector3.Dot(lightNormal, normal);
                    if (L > 0.0f)
                    {
                        polyDrawColor = partColor * lightIllumination * L;
                    }

                    polyDrawColor = RGBA_Floats.ComponentMax(polyDrawColor, partColor * ambiantIllumination);
                    for (i = 0; i < 3; i++)
                    {
                        double ratio      = (points[i].z - minZ) / (maxZ - minZ);
                        int    ratioInt16 = (int)(ratio * 65536);
                        points[i].color = new RGBA_Bytes(polyDrawColor.Red0To255, ratioInt16 >> 8, ratioInt16 & 0xFF);
                    }


#if true
                    scanline_unpacked_8 sl  = new scanline_unpacked_8();
                    ScanlineRasterizer  ras = new ScanlineRasterizer();
                    render_gouraud(graphics2D.DestImage, sl, ras, points);
#else
                    IRecieveBlenderByte oldBlender = graphics2D.DestImage.GetRecieveBlender();
                    graphics2D.DestImage.SetRecieveBlender(new BlenderZBuffer());
                    graphics2D.Render(polygonProjected, renderColor);
                    graphics2D.DestImage.SetRecieveBlender(oldBlender);
#endif

                    byte[] buffer = graphics2D.DestImage.GetBuffer();
                    int    pixels = graphics2D.DestImage.Width * graphics2D.DestImage.Height;
                    for (int pixelIndex = 0; pixelIndex < pixels; pixelIndex++)
                    {
                        buffer[pixelIndex * 4 + ImageBuffer.OrderR] = buffer[pixelIndex * 4 + ImageBuffer.OrderR];
                        buffer[pixelIndex * 4 + ImageBuffer.OrderG] = buffer[pixelIndex * 4 + ImageBuffer.OrderR];
                        buffer[pixelIndex * 4 + ImageBuffer.OrderB] = buffer[pixelIndex * 4 + ImageBuffer.OrderR];
                    }
                }
            }
        }
Esempio n. 23
0
    // тоже можно рассовать по методам
    override protected void SetModel()
    {
        // проверка на предыдущую модель не нужна  - устанавливается через SetStage
        if (!modelsContainerReady) // первая загрузка
        {
            startStageSprites    = Resources.LoadAll <Sprite>("Textures/Plants/oakTree");
            blankModelsContainer = new GameObject("oakTreesContainer").transform;

            blankTrees_stage4 = new List <GameObject>();
            blankTrees_stage5 = new List <GameObject>();
            blankTrees_stage6 = new List <GameObject>();

            //stage 4 model
            GameObject model3d = LoadModel(4);

            // хоть это и первая загрузка, лучше всё равно проверить
            LODController currentLC = LODController.GetCurrent();
            int           regIndex  = currentLC.LOD_existanceCheck(oak4_lod_regInfo);
            if (regIndex == -1)
            {
                RenderPoint[] rpoints = new RenderPoint[] {
                    new RenderPoint(new Vector3(0, 0.222f, -0.48f), Vector3.zero),
                    new RenderPoint(new Vector3(0, 0.479f, -0.434f), new Vector3(30, 0, 0)),
                    new RenderPoint(new Vector3(0, 0.458f, -0.232f), new Vector3(45, 0, 0)),
                    new RenderPoint(new Vector3(0, 0.551f, -0.074f), new Vector3(75, 0, 0))
                };
                regIndex = LODSpriteMaker.current.CreateLODPack(LODPackType.OneSide, model3d, rpoints, 32, 0.25f, Color.green, oak4_lod_regInfo);
            }
            LODRegistrationTicket rticket = currentLC.registeredLODs[regIndex];
            lodPack_stage4    = new Sprite[4];
            lodPack_stage4[0] = rticket.sprites[0];
            lodPack_stage4[1] = rticket.sprites[1];
            lodPack_stage4[2] = rticket.sprites[2];
            lodPack_stage4[3] = rticket.sprites[3];


            GameObject fullModel = new GameObject("oak4");
            fullModel.SetActive(false);

            GameObject     spriterCarrier = new GameObject("lodSpriter");
            SpriteRenderer sr             = spriterCarrier.AddComponent <SpriteRenderer>();
            //сначала добавляется спрайт
            sr.sprite         = lodPack_stage4[0];
            sr.sharedMaterial = PoolMaster.useAdvancedMaterials ? PoolMaster.billboardShadedMaterial: PoolMaster.billboardMaterial;
            if (PoolMaster.shadowCasting)
            {
                sr.receiveShadows = true;
            }
            spriterCarrier.transform.parent        = fullModel.transform;
            spriterCarrier.transform.localPosition = Vector3.up * 0.211f;
            // потом модель
            model3d.transform.parent        = fullModel.transform;
            model3d.transform.localPosition = Vector3.zero;
            model3d.transform.localRotation = Quaternion.identity;
            fullModel.transform.parent      = blankModelsContainer;
            blankTrees_stage4.Add(fullModel);

            // stage 5 model
            model3d  = LoadModel(5);
            regIndex = currentLC.LOD_existanceCheck(oak5_lod_regInfo);
            if (regIndex == -1)
            {
                RenderPoint[] rpoints = new RenderPoint[] {
                    new RenderPoint(new Vector3(0, 0.222f, -0.48f), Vector3.zero),
                    new RenderPoint(new Vector3(0, 0.479f, -0.434f), new Vector3(30, 0, 0)),
                    new RenderPoint(new Vector3(0, 0.458f, -0.232f), new Vector3(45, 0, 0)),
                    new RenderPoint(new Vector3(0, 0.551f, -0.074f), new Vector3(75, 0, 0))
                };
                regIndex = LODSpriteMaker.current.CreateLODPack(LODPackType.OneSide, model3d, rpoints, 32, 0.3f, Color.green, oak5_lod_regInfo);
            }
            rticket           = currentLC.registeredLODs[regIndex];
            lodPack_stage5    = new Sprite[4];
            lodPack_stage5[0] = rticket.sprites[0];
            lodPack_stage5[1] = rticket.sprites[1];
            lodPack_stage5[2] = rticket.sprites[2];
            lodPack_stage5[3] = rticket.sprites[3];
            fullModel         = new GameObject("oak5");
            fullModel.SetActive(false);
            spriterCarrier    = new GameObject("lodSpriter");
            sr                = spriterCarrier.AddComponent <SpriteRenderer>();
            sr.sharedMaterial = PoolMaster.useAdvancedMaterials ? PoolMaster.billboardShadedMaterial : PoolMaster.billboardMaterial;;
            if (PoolMaster.shadowCasting)
            {
                sr.receiveShadows = true;
            }
            sr.sprite = lodPack_stage5[0];
            spriterCarrier.transform.parent        = fullModel.transform;
            spriterCarrier.transform.localPosition = Vector3.up * 0.239f;
            model3d.transform.parent        = fullModel.transform;
            model3d.transform.localPosition = Vector3.zero;
            model3d.transform.localRotation = Quaternion.identity;
            fullModel.transform.parent      = blankModelsContainer;
            blankTrees_stage5.Add(fullModel);

            //stage 6 model
            model3d  = LoadModel(6);
            regIndex = currentLC.LOD_existanceCheck(oak6_lod_regInfo);
            if (regIndex == -1)
            {
                RenderPoint[] rpoints = new RenderPoint[] {
                    new RenderPoint(new Vector3(0, 0.222f, -0.48f), Vector3.zero),
                    new RenderPoint(new Vector3(0, 0.479f, -0.434f), new Vector3(30, 0, 0)),
                    new RenderPoint(new Vector3(0, 0.458f, -0.232f), new Vector3(45, 0, 0)),
                    new RenderPoint(new Vector3(0, 0.551f, -0.074f), new Vector3(75, 0, 0))
                };
                regIndex = LODSpriteMaker.current.CreateLODPack(LODPackType.OneSide, model3d, rpoints, 64, 0.45f, Color.green, oak6_lod_regInfo);
            }
            rticket           = currentLC.registeredLODs[regIndex];
            lodPack_stage6    = new Sprite[4];
            lodPack_stage6[0] = rticket.sprites[0];
            lodPack_stage6[1] = rticket.sprites[1];
            lodPack_stage6[2] = rticket.sprites[2];
            lodPack_stage6[3] = rticket.sprites[3];

            fullModel = new GameObject("oak6");
            fullModel.SetActive(false);
            spriterCarrier    = new GameObject("lodSpriter");
            sr                = spriterCarrier.AddComponent <SpriteRenderer>();
            sr.sharedMaterial = PoolMaster.useAdvancedMaterials ? PoolMaster.billboardShadedMaterial : PoolMaster.billboardMaterial;;
            if (PoolMaster.shadowCasting)
            {
                sr.receiveShadows = true;
            }
            sr.sprite = lodPack_stage6[0];
            spriterCarrier.transform.parent        = fullModel.transform;
            spriterCarrier.transform.localPosition = Vector3.up * 0.21f;
            model3d.transform.parent        = fullModel.transform;
            model3d.transform.localPosition = Vector3.zero;
            model3d.transform.localRotation = Quaternion.identity;
            fullModel.transform.parent      = blankModelsContainer;
            blankTrees_stage6.Add(fullModel);
            //
            modelsContainerReady = true;
            FollowingCamera.main.cameraChangedEvent += CameraUpdate;
        }
        if (stage > TRANSIT_STAGE)
        {
            switch (stage)
            {
            case 4:
                if (blankTrees_stage4.Count > 1)
                {
                    int lastIndex = blankTrees_stage4.Count - 1;
                    modelHolder = blankTrees_stage4[lastIndex];
                    blankTrees_stage4.RemoveAt(lastIndex);
                    if (lastIndex > MAX_INACTIVE_BUFFERED_STAGE4)
                    {
                        Destroy(blankTrees_stage4[lastIndex - 1]);
                        blankTrees_stage4.RemoveAt(lastIndex - 1);
                    }
                }
                else
                {
                    modelHolder = Instantiate(blankTrees_stage4[0], Vector3.zero, Quaternion.identity, transform);
                }
                break;

            case 5:
                if (blankTrees_stage5.Count > 1)
                {
                    int lastIndex = blankTrees_stage5.Count - 1;
                    modelHolder = blankTrees_stage5[lastIndex];
                    blankTrees_stage5.RemoveAt(lastIndex);
                    if (lastIndex > MAX_INACTIVE_BUFFERED_STAGE5)
                    {
                        Destroy(blankTrees_stage5[lastIndex - 1]);
                        blankTrees_stage5.RemoveAt(lastIndex - 1);
                    }
                }
                else
                {
                    modelHolder = Instantiate(blankTrees_stage5[0], Vector3.zero, Quaternion.identity, transform);
                }
                break;

            case 6:
                if (blankTrees_stage6.Count > 1)
                {
                    int lastIndex = blankTrees_stage6.Count - 1;
                    modelHolder = blankTrees_stage6[lastIndex];
                    blankTrees_stage6.RemoveAt(lastIndex);
                    if (lastIndex > MAX_INACTIVE_BUFFERED_STAGE6)
                    {
                        Destroy(blankTrees_stage6[lastIndex - 1]);
                        blankTrees_stage6.RemoveAt(lastIndex - 1);
                    }
                }
                else
                {
                    modelHolder = Instantiate(blankTrees_stage6[0], Vector3.zero, Quaternion.identity, transform);
                }
                break;
            }
            modelHolder.transform.parent        = transform;
            modelHolder.transform.localPosition = Vector3.zero;
            modelHolder.transform.rotation      = Quaternion.Euler(0, modelRotation * 90, 0);
            spriter = modelHolder.transform.GetChild(SPRITER_CHILDNUMBER).GetComponent <SpriteRenderer>();
            // # model draw mode check
            float dist = (transform.position - FollowingCamera.camPos).magnitude;
            if (dist < TREE_SPRITE_MAX_VISIBILITY * stage)
            {
                if (dist < LODController.lodCoefficient)
                {
                    modelHolder.transform.GetChild(MODEL_CHILDNUMBER).gameObject.SetActive(true); // model
                    spriter.enabled = false;                                                      // lod sprite
                    drawmode        = OakDrawMode.DrawModel;
                }
                else
                {
                    modelHolder.transform.GetChild(MODEL_CHILDNUMBER).gameObject.SetActive(false); // model
                    // # setting lod (changed)
                    drawmode = OakDrawMode.DrawLOD;
                    byte  spriteNumber = 0;
                    float angle        = Vector3.Angle(Vector3.up, FollowingCamera.camPos - transform.position);
                    if (angle < 30)
                    {
                        if (angle < 10)
                        {
                            spriteNumber = 3;
                        }
                        else
                        {
                            spriteNumber = 2;
                        }
                    }
                    else
                    {
                        if (angle > 80)
                        {
                            spriteNumber = 0;
                        }
                        else
                        {
                            spriteNumber = 1;
                        }
                    }
                    switch (stage)
                    {
                    case 4: spriter.sprite = lodPack_stage4[spriteNumber]; break;

                    case 5: spriter.sprite = lodPack_stage5[spriteNumber]; break;

                    case 6: spriter.sprite = lodPack_stage6[spriteNumber]; break;
                    }
                    lodNumber = spriteNumber;
                    // eo setting lod
                    spriter.enabled = true; // lod sprite
                }
            }
            else
            {
                spriter.enabled = false;
                drawmode        = OakDrawMode.NoDraw;
            }
            modelHolder.SetActive(true);
        }
        else
        {
            GameObject model          = new GameObject("sprite");
            Transform  modelTransform = model.transform;
            modelTransform.parent        = transform;
            modelTransform.localPosition = Vector3.zero;
            //Vector3 cpos = modelTransform.InverseTransformPoint(FollowingCamera.camPos); cpos.y = 0;
            // modelTransform.LookAt(cpos);
            spriter                = modelTransform.gameObject.AddComponent <SpriteRenderer>();
            spriter.sprite         = startStageSprites[stage];
            spriter.sharedMaterial = PoolMaster.verticalWavingBillboardMaterial;
            spriter.enabled        = ((transform.position - FollowingCamera.camPos).magnitude < TREE_SPRITE_MAX_VISIBILITY * stage);
            drawmode               = OakDrawMode.DrawStartSprite;
        }
    }
Esempio n. 24
0
 public void AssignNextPointInLine(RenderPoint point)
 {
     nextPointInLine = point;
     UpdateLine();
 }
Esempio n. 25
0
    public static HarvestableResource ConstructContainer(ContainerModelType i_modelType, ResourceType i_rtype, float i_count)
    {
        HarvestableResource hr = new GameObject().AddComponent <HarvestableResource>();

        hr.ID = CONTAINER_ID;
        hr.PrepareStructure();
        hr.mainResource  = i_rtype;
        hr.resourceCount = i_count;
        GameObject model;

        bool            createSpriteLOD = false;
        LODRegisterInfo regInfo         = new LODRegisterInfo(0, 0, 0);
        float           height          = 0;

        hr.model_id = i_modelType;
        switch (hr.model_id)
        {
        case ContainerModelType.DeadLifestone:
        {
            hr.gameObject.name = "dead Lifestone";
            model = Instantiate(Resources.Load <GameObject>("Structures/LifeStone"));
            Destroy(model.transform.GetChild(0).gameObject);
            Destroy(model.transform.GetChild(1).gameObject);
            MeshRenderer[] mrrs = model.GetComponentsInChildren <MeshRenderer>();
            foreach (MeshRenderer mr in mrrs)
            {
                mr.sharedMaterial = PoolMaster.GetMaterial(MaterialType.Basic);
            }
            byte c = (byte)(PlaneExtension.INNER_RESOLUTION / 4);
            hr.surfaceRect = new SurfaceRect(c, c, (byte)(c + c));
            hr.maxHp       = LifeSource.MAX_HP * 0.9f;
            break;
        }

        case ContainerModelType.DeadTreeOfLife:
        {
            hr.gameObject.name = "dead Tree of Life";
            model = Instantiate(Resources.Load <GameObject>("Lifeforms/deadTreeOfLife"));
            byte c = (byte)(PlaneExtension.INNER_RESOLUTION / 4);
            hr.surfaceRect = new SurfaceRect(c, c, (byte)(c + c));
            hr.maxHp       = LifeSource.MAX_HP * 0.9f;
            break;
        }

        case ContainerModelType.DeadOak4:
            hr.gameObject.name = "dead oak 4";
            model          = Instantiate(Resources.Load <GameObject>("Lifeforms/oak-4_dead"));
            hr.surfaceRect = SurfaceRect.one;
            hr.maxHp       = 50;

            createSpriteLOD = true;
            regInfo         = new LODRegisterInfo(LODController.CONTAINER_MODEL_ID, (int)ContainerModelType.DeadOak4, 0);
            height          = 0.211f;
            break;

        case ContainerModelType.DeadOak5:
            hr.gameObject.name = "dead oak 5";
            model          = Instantiate(Resources.Load <GameObject>("Lifeforms/oak-6_dead"));
            hr.surfaceRect = SurfaceRect.one;
            hr.maxHp       = 100;

            createSpriteLOD = true;
            regInfo         = new LODRegisterInfo(LODController.CONTAINER_MODEL_ID, (int)ContainerModelType.DeadOak5, 0);
            height          = 0.211f;
            break;

        case ContainerModelType.DeadOak6:
            hr.gameObject.name = "dead oak 6";
            model          = Instantiate(Resources.Load <GameObject>("Lifeforms/oak-6_dead"));
            hr.surfaceRect = SurfaceRect.one;
            hr.maxHp       = 200;

            createSpriteLOD = true;
            regInfo         = new LODRegisterInfo(LODController.CONTAINER_MODEL_ID, (int)ContainerModelType.DeadOak6, 0);
            height          = 0.211f;
            break;

        case ContainerModelType.Pile:
        {
            hr.gameObject.name = "pile";
            model = Instantiate(Resources.Load <GameObject>("Prefs/pilePref"));

            createSpriteLOD = true;
            regInfo         = new LODRegisterInfo((int)ContainerModelType.Pile, 0, hr.mainResource.ID);
            height          = 0.047f;

            Transform meshTransform = model.transform.GetChild(0);
            var       mf            = meshTransform.GetComponent <MeshFilter>();
            var       mr            = meshTransform.GetComponent <MeshRenderer>();
            PoolMaster.SetMaterialByID(
                ref mf,
                ref mr,
                i_rtype.ID,
                255
                );
            hr.maxHp       = 30;
            hr.surfaceRect = SurfaceRect.one;
            break;
        }

        case ContainerModelType.BerryBush:
        {
            hr.gameObject.name = "berry bush";
            model = Instantiate(Resources.Load <GameObject>("Prefs/berryBush"));
            //if (PoolMaster.shadowCasting) PoolMaster.ReplaceMaterials(model, true);
            hr.maxHp       = 10;
            hr.surfaceRect = SurfaceRect.one;
            break;
        }

        case ContainerModelType.Boulder:
        {
            hr.gameObject.name = "boulder";
            model = Instantiate(Resources.Load <GameObject>("Prefs/boulderPref"));
            Transform meshTransform = model.transform.GetChild(0);
            var       mf            = meshTransform.GetComponent <MeshFilter>();
            var       mr            = meshTransform.GetComponent <MeshRenderer>();
            PoolMaster.SetMaterialByID(
                ref mf,
                ref mr,
                i_rtype.ID,
                255
                );

            regInfo         = new LODRegisterInfo((int)ContainerModelType.Boulder, 0, hr.mainResource.ID);
            createSpriteLOD = true;
            height          = 0.047f;

            hr.maxHp       = 50;
            hr.surfaceRect = SurfaceRect.one;
            break;
        }

        default:
        {
            hr.gameObject.name = "default container";
            model = Instantiate(Resources.Load <GameObject>("Prefs/defaultContainer"));
            Transform meshTransform = model.transform.GetChild(0);
            var       mf            = meshTransform.GetComponent <MeshFilter>();
            var       mr            = meshTransform.GetComponent <MeshRenderer>();
            PoolMaster.SetMaterialByID(
                ref mf,
                ref mr,
                i_rtype.ID,
                255
                );

            hr.model_id = ContainerModelType.Default;

            hr.maxHp       = 10;
            hr.surfaceRect = SurfaceRect.one;
            break;
        }
        }
        hr.hp = hr.maxHp;

        if (createSpriteLOD)
        {
            SpriteRenderer sr = new GameObject("lod").AddComponent <SpriteRenderer>();
            sr.transform.parent        = model.transform;
            sr.transform.localPosition = Vector3.up * height;
            sr.sharedMaterial          = PoolMaster.useAdvancedMaterials ? PoolMaster.billboardShadedMaterial : PoolMaster.billboardMaterial;;
            if (PoolMaster.shadowCasting)
            {
                sr.receiveShadows = true;
            }
            LODController currentLC = LODController.GetCurrent();
            LODPackType   lpackType = LODPackType.Point;
            int           indexInRegistered = currentLC.LOD_existanceCheck(regInfo);
            float         lodDistance = 6, visibilityDistance = 15;

            if (indexInRegistered == -1)
            {
                int           resolution      = 8;
                float         size            = 0.05f;
                Color         backgroundColor = Color.gray;
                RenderPoint[] renderpoints    = new RenderPoint[] { };

                switch (hr.model_id)
                {
                case ContainerModelType.Pile:
                {
                    renderpoints = new RenderPoint[] { new RenderPoint(new Vector3(0, 0.084f, -0.063f), new Vector3(45, 0, 0)) };
                    break;
                }

                case ContainerModelType.Boulder:
                {
                    renderpoints = new RenderPoint[] { new RenderPoint(new Vector3(0, 0.084f, -0.063f), new Vector3(45, 0, 0)) };
                    break;
                }

                case ContainerModelType.DeadOak4:
                {
                    renderpoints = new RenderPoint[] {
                        new RenderPoint(new Vector3(0, 0.222f, -0.48f), Vector3.zero),
                        new RenderPoint(new Vector3(0, 0.479f, -0.434f), new Vector3(30, 0, 0)),
                        new RenderPoint(new Vector3(0, 0.458f, -0.232f), new Vector3(45, 0, 0)),
                        new RenderPoint(new Vector3(0, 0.551f, -0.074f), new Vector3(75, 0, 0))
                    };
                    size               = 0.2f;
                    resolution         = 32;
                    lpackType          = LODPackType.OneSide;
                    lodDistance        = 15;
                    visibilityDistance = 24;
                    break;
                }

                case ContainerModelType.DeadOak5:
                {
                    renderpoints = new RenderPoint[] {
                        new RenderPoint(new Vector3(0, 0.222f, -0.48f), Vector3.zero),
                        new RenderPoint(new Vector3(0, 0.479f, -0.434f), new Vector3(30, 0, 0)),
                        new RenderPoint(new Vector3(0, 0.458f, -0.232f), new Vector3(45, 0, 0)),
                        new RenderPoint(new Vector3(0, 0.551f, -0.074f), new Vector3(75, 0, 0))
                    };
                    size               = 0.25f;
                    resolution         = 32;
                    lpackType          = LODPackType.OneSide;
                    lodDistance        = 18;
                    visibilityDistance = 28;
                    break;
                }

                case ContainerModelType.DeadOak6:
                {
                    renderpoints = new RenderPoint[] {
                        new RenderPoint(new Vector3(0, 0.222f, -0.48f), Vector3.zero),
                        new RenderPoint(new Vector3(0, 0.479f, -0.434f), new Vector3(30, 0, 0)),
                        new RenderPoint(new Vector3(0, 0.458f, -0.232f), new Vector3(45, 0, 0)),
                        new RenderPoint(new Vector3(0, 0.551f, -0.074f), new Vector3(75, 0, 0))
                    };
                    size               = 0.4f;
                    lodDistance        = 21;
                    visibilityDistance = 32;
                    resolution         = 64;
                    lpackType          = LODPackType.OneSide;
                    break;
                }
                }

                indexInRegistered = LODSpriteMaker.current.CreateLODPack(lpackType, model, renderpoints, resolution, size, backgroundColor, regInfo);
            }
            model.transform.parent        = hr.transform;
            model.transform.localPosition = Vector3.zero;
            model.transform.localRotation = Quaternion.Euler(Vector3.zero);
            LODController.GetCurrent().TakeCare(model.transform, indexInRegistered, lodDistance, visibilityDistance);
        }
        else
        {
            model.transform.parent        = hr.transform;
            model.transform.localPosition = Vector3.zero;
            model.transform.localRotation = Quaternion.Euler(Vector3.zero);
        }
        return(hr);
    }