virtual protected void AddBorders(Vector2 leftPoint, Color leftColor, Vector2 leftDirectionNormalized, Vector2 rightPoint, Color rightColor, Vector2 rightDirectionNormalized, bool top) { if ((borders != null) && (borders.Count > 0)) { int n = borders.Count; for (int i = 0; i < n; i++) { FDrawingBorder border = borders[i]; if ((border.top && top) || (border.bottom && !top)) { FDrawingQuad quad = new FDrawingQuad(border.color); quad.tlVertice = leftPoint + leftDirectionNormalized * border.thickness; quad.blVertice = leftPoint; quad.brVertice = rightPoint; quad.trVertice = rightPoint + rightDirectionNormalized * border.thickness; if (border.gradient) { quad.blColor = leftColor; quad.brColor = rightColor; } _quads.AddLast(quad); leftPoint = quad.tlVertice; leftColor = quad.tlColor; rightPoint = quad.trVertice; rightColor = quad.trColor; } } } }
public void Copy(FDrawingCursor model) { _quads = model.GetQuads(); lineFromValid = model.lineFromValid; thickness = model.thickness; jointType = model.jointType; capType = model.capType; color = model.color; position = model.position; lineFromPosition = model.lineFromPosition; direction = model.direction; //topQuad=model.topQuad; //bottomQuad=model.bottomQuad; lineQuad = model.lineQuad; if (model.borders != null) { borders = new List <FDrawingBorder>(model.borders.Count); int n = model.borders.Count; for (int i = 0; i < n; i++) { FDrawingBorder border = model.borders[i]; borders.Add(border.Clone()); } } else { borders = null; } }
public void Copy(FDrawingBorder model) { thickness = model.thickness; gradient = model.gradient; color = model.color; top = model.top; bottom = model.bottom; topQuad = model.topQuad; bottomQuad = model.bottomQuad; }
virtual protected void AddLineSideBorders(FDrawingQuad topBaseQuad, FDrawingQuad bottomBaseQuad) { if (borders != null) { Vector2 ortho = new Vector2(-direction.y, direction.x); FDrawingQuad quad; int n = borders.Count; for (int i = 0; i < n; i++) { FDrawingBorder border = borders[i]; //top if (border.top) { quad = new FDrawingQuad(border.color); quad.tlVertice = topBaseQuad.tlVertice + ortho * border.thickness; quad.trVertice = topBaseQuad.trVertice + ortho * border.thickness; quad.blVertice = topBaseQuad.tlVertice; quad.brVertice = topBaseQuad.trVertice; if (border.gradient) { quad.blColor = topBaseQuad.tlColor; quad.brColor = topBaseQuad.trColor; } _quads.AddLast(quad); border.topQuad = quad; topBaseQuad = quad; } //bottom if (border.bottom) { quad = new FDrawingQuad(border.color); quad.blVertice = bottomBaseQuad.blVertice - ortho * border.thickness; quad.brVertice = bottomBaseQuad.brVertice - ortho * border.thickness; quad.tlVertice = bottomBaseQuad.blVertice; quad.trVertice = bottomBaseQuad.brVertice; if (border.gradient) { quad.tlColor = bottomBaseQuad.blColor; quad.trColor = bottomBaseQuad.brColor; } _quads.AddLast(quad); border.bottomQuad = quad; bottomBaseQuad = quad; } } } }
public FDrawingBorder(FDrawingBorder model) : base() { Copy(model); }
public void Copy(FDrawingBorder model) { thickness=model.thickness; gradient=model.gradient; color=model.color; topQuad=model.topQuad; bottomQuad=model.bottomQuad; }
virtual public void DrawJoint(FDrawingCursor previousCursor) { Vector2 prevOrtho = new Vector2(-previousCursor.direction.y, previousCursor.direction.x); Vector2 ortho = new Vector2(-direction.y, direction.x); float dot = Vector2.Dot(prevOrtho, direction); //Cut inside of the turn bool medianDone = false; Vector2 median = Vector2.zero; if (borders != null) { if (borders.Count > 0) { median = prevOrtho + ortho; median.Normalize(); medianDone = true; if (median == Vector2.zero) { //??? } else { Vector2 A = lineFromPosition; Vector2 B = lineFromPosition + median; float S, T; bool ret; if (dot < 0) //bottomQuad { int n = borders.Count; for (int i = 0; i < n; i++) { FDrawingBorder border = borders[i]; if (border.bottom) { FDrawingBorder previousBorder = previousCursor.borders[i]; //Previous line //bottom line ret = VectorUtils.LinesIntersect(A, B, previousBorder.bottomQuad.blVertice, previousBorder.bottomQuad.brVertice, out S, out T); if ((ret) && (T >= 0) && (T <= 1)) { previousBorder.bottomQuad.brVertice = A + S * (B - A); } else { ret = VectorUtils.LinesIntersect(A, B, previousBorder.bottomQuad.tlVertice, previousBorder.bottomQuad.blVertice, out S, out T); if ((ret) && (T >= 0) && (T <= 1)) { previousBorder.bottomQuad.brVertice = A + S * (B - A); previousBorder.bottomQuad.blVertice = previousBorder.bottomQuad.brVertice; } } //topline ret = VectorUtils.LinesIntersect(A, B, previousBorder.bottomQuad.tlVertice, previousBorder.bottomQuad.trVertice, out S, out T); if ((ret) && (T >= 0) && (T <= 1)) { previousBorder.bottomQuad.trVertice = A + S * (B - A); } //Current line //bottom line ret = VectorUtils.LinesIntersect(A, B, border.bottomQuad.blVertice, border.bottomQuad.brVertice, out S, out T); if ((ret) && (T >= 0) && (T <= 1)) { border.bottomQuad.blVertice = A + S * (B - A); } else { ret = VectorUtils.LinesIntersect(A, B, border.bottomQuad.trVertice, border.bottomQuad.brVertice, out S, out T); if ((ret) && (T >= 0) && (T <= 1)) { border.bottomQuad.brVertice = A + S * (B - A); border.bottomQuad.blVertice = border.bottomQuad.brVertice; } } //topline ret = VectorUtils.LinesIntersect(A, B, border.bottomQuad.tlVertice, border.bottomQuad.trVertice, out S, out T); if ((ret) && (T >= 0) && (T <= 1)) { border.bottomQuad.tlVertice = A + S * (B - A); } } //i++; } } else if (dot > 0) //topQuad { int n = borders.Count; for (int i = 0; i < n; i++) { FDrawingBorder border = borders[i]; if (border.top) { FDrawingBorder previousBorder = previousCursor.borders[i]; //Previous line //top line ret = VectorUtils.LinesIntersect(A, B, previousBorder.topQuad.tlVertice, previousBorder.topQuad.trVertice, out S, out T); if ((ret) && (T >= 0) && (T <= 1)) { previousBorder.topQuad.trVertice = A + S * (B - A); } else { ret = VectorUtils.LinesIntersect(A, B, previousBorder.topQuad.tlVertice, previousBorder.topQuad.blVertice, out S, out T); if ((ret) && (T >= 0) && (T <= 1)) { previousBorder.topQuad.trVertice = A + S * (B - A); previousBorder.topQuad.tlVertice = previousBorder.topQuad.trVertice; } } //bottom line ret = VectorUtils.LinesIntersect(A, B, previousBorder.topQuad.blVertice, previousBorder.topQuad.brVertice, out S, out T); if ((ret) && (T >= 0) && (T <= 1)) { previousBorder.topQuad.brVertice = A + S * (B - A); } //Current line //top line ret = VectorUtils.LinesIntersect(A, B, border.topQuad.tlVertice, border.topQuad.trVertice, out S, out T); if ((ret) && (T >= 0) && (T <= 1)) { border.topQuad.tlVertice = A + S * (B - A); } else { ret = VectorUtils.LinesIntersect(A, B, border.topQuad.trVertice, border.topQuad.trVertice, out S, out T); if ((ret) && (T >= 0) && (T <= 1)) { border.topQuad.trVertice = A + S * (B - A); border.topQuad.tlVertice = border.topQuad.trVertice; } } //bottom line ret = VectorUtils.LinesIntersect(A, B, border.topQuad.blVertice, border.topQuad.brVertice, out S, out T); if ((ret) && (T >= 0) && (T <= 1)) { border.topQuad.blVertice = A + S * (B - A); } } //i++; } } } } } Vector2 center = lineFromPosition; //if ((color.a<1)&&(previousCursor.color.a<1)) { //not necessary for solid colors but removing overlapping mught help performances anyway if (!medianDone) { median = prevOrtho + ortho; median.Normalize(); medianDone = true; } if (median == Vector2.zero) { //??? } else { Vector2 A = lineFromPosition; Vector2 B = lineFromPosition + median; float S, T; bool ret; if (dot < 0) //bottomQuad //Previous line { ret = VectorUtils.LinesIntersect(A, B, previousCursor.lineQuad.blVertice, previousCursor.lineQuad.brVertice, out S, out T); if ((ret) && (T >= 0) && (T <= 1)) { center = previousCursor.lineQuad.brVertice = A + S * (B - A); } //Current line ret = VectorUtils.LinesIntersect(A, B, lineQuad.blVertice, lineQuad.brVertice, out S, out T); if ((ret) && (T >= 0) && (T <= 1)) { center = lineQuad.blVertice = A + S * (B - A); } } else if (dot > 0) //topQuad //Previous line { ret = VectorUtils.LinesIntersect(A, B, previousCursor.lineQuad.tlVertice, previousCursor.lineQuad.trVertice, out S, out T); if ((ret) && (T >= 0) && (T <= 1)) { center = previousCursor.lineQuad.trVertice = A + S * (B - A); } //Current line ret = VectorUtils.LinesIntersect(A, B, lineQuad.tlVertice, lineQuad.trVertice, out S, out T); if ((ret) && (T >= 0) && (T <= 1)) { center = lineQuad.tlVertice = A + S * (B - A); } } } //} //Draw joint if (jointType == FTDrawingJointStyle.BEVEL) { if (dot < 0) { FDrawingQuad quad = new FDrawingQuad(this.color); quad.tlVertice = previousCursor.position + prevOrtho * previousCursor.thickness * 0.5f; quad.blVertice = center; quad.brVertice = center; quad.trVertice = lineFromPosition + ortho * thickness * 0.5f; _quads.AddLast(quad); AddBorders(quad.tlVertice, quad.tlColor, prevOrtho, quad.trVertice, quad.trColor, ortho, true); } else if (dot > 0) { FDrawingQuad quad = new FDrawingQuad(this.color); quad.blVertice = previousCursor.position - prevOrtho * previousCursor.thickness * 0.5f; quad.tlVertice = center; quad.trVertice = center; quad.brVertice = lineFromPosition - ortho * thickness * 0.5f; _quads.AddLast(quad); AddBorders(quad.blVertice, quad.blColor, -prevOrtho, quad.brVertice, quad.brColor, -ortho, false); } else { // What else? // Parallel lines, no joint necessary } } else if (jointType == FTDrawingJointStyle.ROUND) { if (dot < 0) { float angleDiff = Mathf.Abs(Mathf.Acos(Vector2.Dot(previousCursor.direction, direction))); int nbQuads = (int)(this.thickness * 0.5f * angleDiff * 0.5f * 0.5f * 0.5f) * 2 + 2; float angle = 0; //2 triangles by quads float deltaAngle = 0.5f * angleDiff / nbQuads; for (int i = 0; i < nbQuads; i++) { FDrawingQuad quad = new FDrawingQuad(color); //FDrawingQuad quad=new FDrawingQuad(new Color(1,(float)i/(float)nbQuads,(float)i/(float)nbQuads,1)); quad.trVertice = center; quad.brVertice = previousCursor.position + prevOrtho * thickness * 0.5f * Mathf.Cos(angle) + previousCursor.direction * thickness * 0.5f * Mathf.Sin(angle); angle += deltaAngle; quad.blVertice = previousCursor.position + prevOrtho * thickness * 0.5f * Mathf.Cos(angle) + previousCursor.direction * thickness * 0.5f * Mathf.Sin(angle); angle += deltaAngle; quad.tlVertice = previousCursor.position + prevOrtho * thickness * 0.5f * Mathf.Cos(angle) + previousCursor.direction * thickness * 0.5f * Mathf.Sin(angle); _quads.AddLast(quad); } } else if (dot > 0) { float angleDiff = Mathf.Abs(Mathf.Acos(Vector2.Dot(previousCursor.direction, direction))); int nbQuads = (int)(this.thickness * 0.5f * angleDiff * 0.5f * 0.5f * 0.5f) * 2 + 2; float angle = 0; //2 triangles by quads float deltaAngle = 0.5f * angleDiff / nbQuads; for (int i = 0; i < nbQuads; i++) { FDrawingQuad quad = new FDrawingQuad(color); //FDrawingQuad quad=new FDrawingQuad(new Color(1,(float)i/(float)nbQuads,(float)i/(float)nbQuads,1)); quad.trVertice = center; quad.brVertice = previousCursor.position - prevOrtho * thickness * 0.5f * Mathf.Cos(-angle) + previousCursor.direction * thickness * 0.5f * Mathf.Sin(-angle); angle -= deltaAngle; quad.blVertice = previousCursor.position - prevOrtho * thickness * 0.5f * Mathf.Cos(-angle) + previousCursor.direction * thickness * 0.5f * Mathf.Sin(-angle); angle -= deltaAngle; quad.tlVertice = previousCursor.position - prevOrtho * thickness * 0.5f * Mathf.Cos(-angle) + previousCursor.direction * thickness * 0.5f * Mathf.Sin(-angle); _quads.AddLast(quad); } } else { // What else? // Parallel lines, no joint necessary } if ((borders != null) && (borders.Count > 0)) { throw new FutileException("Joint type " + jointType + " not suported with borders. " + supportedJointTypesWithBorders); } } else if (jointType == FTDrawingJointStyle.MITER) { if (dot < 0) { FDrawingQuad quad = new FDrawingQuad(this.color); quad.tlVertice = previousCursor.position + prevOrtho * previousCursor.thickness * 0.5f; quad.blVertice = center; quad.brVertice = lineFromPosition + ortho * thickness * 0.5f; bool valid; quad.trVertice = VectorUtils.LinesIntersectPoint(quad.tlVertice, quad.tlVertice + previousCursor.direction, quad.brVertice, quad.brVertice - direction, out valid); if (!valid) { quad.trVertice = quad.brVertice; } _quads.AddLast(quad); } else if (dot > 0) { FDrawingQuad quad = new FDrawingQuad(this.color); quad.blVertice = previousCursor.position - prevOrtho * previousCursor.thickness * 0.5f; quad.tlVertice = center; quad.trVertice = lineFromPosition - ortho * thickness * 0.5f; bool valid; quad.brVertice = VectorUtils.LinesIntersectPoint(quad.blVertice, quad.blVertice - previousCursor.direction, quad.trVertice, quad.trVertice + direction, out valid); if (!valid) { quad.brVertice = quad.trVertice; } _quads.AddLast(quad); } else { // What else? // Parallel lines, no joint necessary } if ((borders != null) && (borders.Count > 0)) { throw new FutileException("Joint type " + jointType + " not suported with borders. " + supportedJointTypesWithBorders); } } }