//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(); }
/// <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; }
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); } }
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))); } }
//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); } } } } }
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); } }
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(); }
/// <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); }
/// <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); }
/// <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); }
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 }); }
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); }
//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); } }
/// <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); }
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]; } } } }
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); }
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); }
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); }
/// <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++; }
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); } } }
// тоже можно рассовать по методам 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; } }
public void AssignNextPointInLine(RenderPoint point) { nextPointInLine = point; UpdateLine(); }
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); }