private void DrawTextureFilterMode() { GUILayout.BeginHorizontal(EditorStyles.textField); GUILayout.Label("过滤模式为Trilinear的纹理"); DrawTextureProperties("t:texture", TextureSetting.FilterMode, (path) => { if (Texture2DExtension.FilterModeIsTrilinear(path)) { _textureSettingPaths.Add(path); } }, (path) => { Texture2DExtension.SetFilterMode(path); } ); GUILayout.EndHorizontal(); DrawTextureScrollList(TextureSetting.FilterMode, (path) => { Texture2DExtension.SetFilterMode(path); }); }
private void DrawTextureCompression() { GUILayout.BeginHorizontal(EditorStyles.textField); GUILayout.Label("使用非压缩格式的纹理"); DrawTextureProperties("t:texture", TextureSetting.Compression, (path) => { if (Texture2DExtension.IsCompression(path)) { _textureSettingPaths.Add(path); } }, (path) => { Texture2DExtension.SetCompression(path); } ); GUILayout.EndHorizontal(); DrawTextureScrollList(TextureSetting.Compression, (path) => { Texture2DExtension.SetCompression(path); }); }
private void DrawTextureReadWrite() { GUILayout.BeginHorizontal(EditorStyles.textField); GUILayout.Label("开启Read/Write选项的纹理"); DrawTextureProperties("t:texture", TextureSetting.ReadWrite, (path) => { if (Texture2DExtension.IsReadable(path)) { _textureSettingPaths.Add(path); } }, (path) => { Texture2DExtension.SetReadable(path); } ); GUILayout.EndHorizontal(); DrawTextureScrollList(TextureSetting.ReadWrite, (path) => { Texture2DExtension.SetReadable(path); }); }
private void DrawTextureWrapMode() { GUILayout.BeginHorizontal(EditorStyles.textField); GUILayout.Label("Wrap模式为Repeat的纹理"); DrawTextureProperties("t:texture", TextureSetting.WrapMode, (path) => { if (Texture2DExtension.WrapModeIsRepeat(path)) { _textureSettingPaths.Add(path); } }, (path) => { Texture2DExtension.SetWrapMode(path); } ); GUILayout.EndHorizontal(); DrawTextureScrollList(TextureSetting.WrapMode, (path) => { Texture2DExtension.SetWrapMode(path); }); }
private DecembristVertex AddPeople(TextTextureFactory textTextureFactory, UnityEngine.Object man, GraphForBillboardVertexes graphController, Texture2D selectFrame, bool isDec) { var picked = (Texture2D)man; var name = textTextureFactory.MakeTextTexture(picked.name.Replace(',', '\n').Replace(' ', '\n').Replace("\n\n", "\n"), true); const float scale = 15f; var resizedTexture = Texture2DExtension.ResizeTexture(picked, name.width, picked.height / picked.width * name.width); var image1 = new PositionedImage[2] { (resizedTexture, new Vector2Int(0, name.height)), (name, new Vector2Int(0, 0)) }; var image2 = new PositionedImage[1] { (selectFrame, Vector2Int.zero) }; var width = Math.Max(resizedTexture.width, name.width); var height = resizedTexture.height + name.height; var comIm1 = new CombinedImages(image1, width, height, initTransparentBackground: true); var billPar1 = new BillboardParameters[1] { new BillboardParameters(Texture2DExtension.CombineTextures(comIm1), Vector4.zero, new Vector2(scale, height * scale / width), 0.1f, false, Color.white) }; var comIm2 = new CombinedImages(image2, selectFrame.width, selectFrame.height, initTransparentBackground: true); var value = Mathf.Max(scale + 3.5f, height * scale / width + 3.5f); var billPar2 = new BillboardParameters(Texture2DExtension.CombineTextures(comIm2), Vector4.zero, new Vector2(value, value), 0.1f, true, Color.red); var verPar = new SelectableVertexParameters(billPar1, billPar2); var vertex = graphController.SpawnVertex <DecembristVertex, SelectableVertexParameters>(verPar); vertex.IsDec = isDec; vertex.Name = picked.name; return(vertex); }
public void CreateVertex() { var texture = _defaultTexture; if (!string.IsNullOrEmpty(_imagePath.text)) { texture = Texture2D.whiteTexture; using var fs = new FileStream(_imagePath.text, FileMode.Open); var bytes = new byte[fs.Length]; fs.Read(bytes, 0, bytes.Length); texture.LoadImage(bytes); } var customFont = FontsGenerator.GetOrCreateFont("Broadway", 32); var selectFrame = Texture2DExtension.ResizeTexture(Resources.Load <Texture2D>(_selectFrameTexture), 200, 200); selectFrame.name = "SelectFrame"; var TextTextureFactory = new TextTextureFactory(customFont, 0); var imageParameters = new BillboardParameters(texture, scale: _scale.Vector * 3f); var selectFrameParameters = new BillboardParameters(selectFrame, scale: _scale.Vector * 6f, isMonoColor: true, useCache: false); var text = TextTextureFactory.MakeTextTexture(_name.text, true); float scale = 10; var textParameters = new BillboardParameters(text, new Vector4(0, -Mathf.Max(_scale.Vector.x, _scale.Vector.y) - 10, 0, 0), new Vector2(scale, text.height * 1.0f / text.width * scale)); var currentVertex = AbstractGraph.GetComponent <AbstractGraph>().SpawnVertex <SelectableVertex, SelectableVertexParameters>( new SelectableVertexParameters(new[] { imageParameters, textParameters }, selectFrameParameters, _positon.Vector)); }
public override Texture2D CreateTexture(int width, int height) { var tex = Texture2DExtension.Create(width, height, textureFormat, useMipMap, linear); ApplyToNew(tex); return(tex); }
protected virtual void CaptureDirect(RenderTexture src) { using (var tex = new ScopedObject <Texture2D>( Texture2DExtension.Create(src.width, src.height, TextureFormat.ARGB32, false, false))) using (new RenderTextureActivator(src)) { tex.Data.ReadPixels(new Rect(0, 0, src.width, src.height), 0, 0); serializer.Serialize(tex); } }
public GraphForBillboardVertexes CreateGraph() { var graph = new GameObject("Graph"); var graphControler = graph.AddComponent <GraphForBillboardVertexes>(); Graphs.Add(graphControler); graphControler.SetupParams(new GraphParameters(new Vector3(0, -20), "Test")); var customFont = FontsGenerator.GetOrCreateFont("Broadway", 32); var mainTexture = Texture2DExtension.ResizeTexture(Resources.Load <Texture2D>(_mainTexture), 200, 200); mainTexture.name = "Target"; var selectFrame = Texture2DExtension.ResizeTexture(Resources.Load <Texture2D>(_selectFrameTexture), 200, 200); selectFrame.name = "SelectFrame"; var textTextureFactory = new TextTextureFactory(customFont, 0); var baseScale = Vector2.one; var imageParameters = new BillboardParameters(mainTexture, scale: baseScale * 3f, useCache: true); var selectFrameParameters = new BillboardParameters(selectFrame, scale: baseScale * 6f, isMonoColor: true, useCache: false); var edgeParameters = new StretchableEdgeParameters(new StretchableEdgeMaterialParameters(Color.white, true), new SpringParameters(1, 10)); BillboardVertex?vertex = null; for (var i = 0; i < 1000; ++i) { var text = textTextureFactory.MakeTextTexture($"Vertex{i}", true); const float scale = 10; var textParameters = new BillboardParameters(text, new Vector4(0, -5, 0, 0), new Vector2(scale, text.height * 1.0f / text.width * scale)); var currentVertex = graphControler.SpawnVertex <SelectableVertex, SelectableVertexParameters>( new SelectableVertexParameters(new[] { imageParameters, textParameters }, selectFrameParameters, new Vector3(i % 32 * 10, i / 32 * 10))); if (vertex != null) { currentVertex.Link <StretchableEdge, StretchableEdgeParameters>(vertex, edgeParameters); } vertex = currentVertex; } return(graphControler); }
private void DrawBoundingBoxesOnCanvas(BoundingBoxXYWH box) { // Check the bounds of bounding box // Give buffer for line drawing to prevent wrap around int x1 = box.X > 0.0f ? (int)box.X : 3; int y1 = box.Y > 0.0f ? (int)box.Y : 3; int x2 = (box.Width + x1) > textureSize.x ? (int)(textureSize.x) - 3 : (int)(box.Width + x1); int y2 = (box.Height + y1) > textureSize.y ? (int)(textureSize.y) - 3 : (int)(box.Height + y1); Debug.LogFormat("x1: {0}, y1: {1}, x2: {2}, y2: {3}", x1, y1, x2, y2); // Plot on texture var topLeft = new Vector2(x1, y1); var bottomRight = new Vector2(x2, y2); _texture = Texture2DExtension.Box( _texture, topLeft, bottomRight, box.color); // Create a new 3D text object at position and // set the label string.Canvas is scaled to x = -0.5, 5 // and y = -0.5, 0.5. var xText = ((topLeft.x / textureSize.x) - 0.5f) + 0.01f; var yText = 0.5f - (1.0f - (topLeft.y / textureSize.y)); var thisBoundingBox = Instantiate( textBoxPrefab, Vector3.zero, Quaternion.identity, this.gameObject.transform) as GameObject; thisBoundingBox.transform.localPosition = new Vector3(xText, yText, 0f); // Set the label of the bounding box. thisBoundingBox.GetComponent <TextMesh>().text = box.label; thisBoundingBox.GetComponent <TextMesh>().color = box.color; // Move the gameobject to become visible this.gameObject.transform.localPosition += new Vector3(0, 0, -0.002f); }
// Start is called before the first frame update void Start() { // Get material component from attached game object via the mesh renderer. _material = this.gameObject.GetComponent <MeshRenderer>().material; // Create a new texture instance with same size as the canvas. _texture = new Texture2D((int)textureSize.x, (int)textureSize.y); // Set the texture to transparent (with helper method) _texture = Texture2DExtension.TransparentTexture(_texture); // Draw bounding boxes at specified coordinates. foreach (var box in boundingBoxes) { DrawBoundingBoxesOnCanvas(box); } // Apply and set main material texture; _texture.Apply(); _material.mainTexture = _texture; ScreenCapture.CaptureScreenshot("Assets/catBoundingBox.jpg"); }
public override void InitTask() { var graph = new GameObject("Graph"); var graphControler = graph.AddComponent <GraphForBillboardVertexes>(); Graphs.Add(graphControler); graphControler.SetupParams(new GraphParameters(new Vector3(0, -20), "Test")); var customFont = FontsGenerator.GetOrCreateFont("Arial", 32); var mainTexture = Texture2DExtension.ResizeTexture(Resources.Load <Texture2D>(_mainTexture), 800, 800); mainTexture.name = "Target"; var dotTexture = Texture2DExtension.ResizeTexture(Resources.Load <Texture2D>(_mainTexture), 800, 800); mainTexture.name = "Dot"; var selectFrame = Texture2DExtension.ResizeTexture(Resources.Load <Texture2D>(_selectFrameTexture), 800, 800); selectFrame.name = "SelectFrame"; var textTextureFactory = new TextTextureFactory(customFont, 0); var baseScale = Vector2.one; var imageParameters = new BillboardParameters(mainTexture, scale: baseScale * 3f, useCache: true); var selectFrameParameters = new BillboardParameters(selectFrame, scale: baseScale * 6f, isMonoColor: true, useCache: false); var text = textTextureFactory.MakeTextTexture($"Select Me", true); const float scale = 10; var textParameters = new BillboardParameters(text, new Vector4(0, -5, 0, 0), new Vector2(scale, text.height * 1.0f / text.width * scale), isMonoColor: true, monoColor: Color.white); _selectableVertex = graphControler.SpawnVertex <SelectableVertex, SelectableVertexParameters>( new SelectableVertexParameters(new[] { imageParameters, textParameters }, selectFrameParameters, new Vector3(-20, 20))); var dotImageParameters = new BillboardParameters(mainTexture, scale: baseScale * 3f, useCache: true); text = textTextureFactory.MakeTextTexture($"Dot 1", true); textParameters = new BillboardParameters(text, new Vector4(0, -5, 0, 0), new Vector2(scale, text.height * 1.0f / text.width * scale), isMonoColor: true, monoColor: Color.white); _dot1 = graphControler.SpawnVertex <BillboardVertex, BillboardVertexParameters>( new BillboardVertexParameters(new[] { imageParameters, textParameters }, new Vector3(0, 20))); text = textTextureFactory.MakeTextTexture($"Dot 2", true); textParameters = new BillboardParameters(text, new Vector4(0, -5, 0, 0), new Vector2(scale, text.height * 1.0f / text.width * scale), isMonoColor: true, monoColor: Color.white); _dot2 = graphControler.SpawnVertex <BillboardVertex, BillboardVertexParameters>( new BillboardVertexParameters(new[] { imageParameters, textParameters }, new Vector3(20, 20))); text = textTextureFactory.MakeTextTexture($"Move me", true); textParameters = new BillboardParameters(text, new Vector4(0, -5, 0, 0), new Vector2(scale, text.height * 1.0f / text.width * scale), isMonoColor: true, monoColor: Color.white); _moveVertex = graphControler.SpawnVertex <BillboardVertex, BillboardVertexParameters>( new BillboardVertexParameters(new[] { imageParameters, textParameters }, new Vector3(30, 20, -10))); text = textTextureFactory.MakeTextTexture($"Click me", true); textParameters = new BillboardParameters(text, new Vector4(0, -5, 0, 0), new Vector2(scale, text.height * 1.0f / text.width * scale), isMonoColor: true, monoColor: Color.white); var clickVeretex = graphControler.SpawnVertex <BillboardVertex, BillboardVertexParameters>( new BillboardVertexParameters(new[] { imageParameters, textParameters }, new Vector3(-50, 20, -10))); var snowPref = Resources.Load <GameObject>(@"Prefabs\Snowflake"); clickVeretex.gameObject.AddComponent <Button3D>().Action = (g) => { _clickCount++; Destroy(Instantiate(snowPref, clickVeretex.transform.position, Quaternion.identity), 2); }; var colors = new List <Color>(7) { new Color(1f, 0f, 0f), new Color(1f, 127f / 255f, 0f), new Color(1f, 1f, 0f), new Color(0f, 1f, 0f), new Color(0f, 0f, 1f), new Color(75f / 255f, 0f, 130f / 255f), new Color(143f, 0f, 1f), }; var edgeTypes = new List <(Type type, EdgeParameters parameters)>(1) { (typeof(StretchableEdge), new StretchableEdgeParameters(new StretchableEdgeMaterialParameters(Color.white), new SpringParameters(1, 10))) }; var player = CreatePlayer(); player.SetupParams(new PlayerParameters(Vector3.zero, Vector3.zero, SceneParametersContainer.PlayerSpeed, 20, isVR: SceneParametersContainer.IsVR, new ToolConfig[4] { new ToolConfig(typeof(SelectItemTool), new SelectItemToolParams(colors)), new ToolConfig(typeof(GrabItemTool), new GrabItemToolParams()), new ToolConfig(typeof(EdgeCreaterTool), new EdgeCreaterToolParams(edgeTypes)), new ToolConfig(typeof(ClickTool), new ClickToolParams()) })); }
public override void InitTask() { var player = CreatePlayer(); var toolConfig = new ToolConfig(typeof(ClickTool), new ClickToolParams()); player.SetupParams(new PlayerParameters(new Vector3(0, 0, -50), Vector3.zero, SceneParametersContainer.PlayerSpeed, sceneInfo: "Hub scene", isVR: SceneParametersContainer.IsVR, toolConfigs: new[] { toolConfig })); //ToDo : Replace with auto generation var customFont = FontsGenerator.GetOrCreateFont("Arial", 128); var textTextureFactory = new TextTextureFactory(customFont, 0); { var graph = new GameObject("Tutorial tasks"); var graphControler = graph.AddComponent <GraphForBillboardVertexes>(); graphControler.ColliderEnable = false; Graphs.Add(graphControler); var baseScale = Vector2.one; graphControler.SetupParams(new GraphParameters(new Vector3(-20, 0, 0), "Tutorial tasks")); var text = textTextureFactory.MakeTextTexture("Tools test", true); var mainTexture = Texture2DExtension.ResizeTexture(Resources.Load <Texture2D>(_mainTexture), 400, 400); var imageParameters = new BillboardParameters(mainTexture, Vector4.zero, new Vector2(9, 2), useCache: true); var textParameters = new BillboardParameters(text, Vector4.zero, new Vector2(4, 0.4f), useCache: false, isMonoColor: true, monoColor: Color.white); var vertexParameters = new BillboardVertexParameters(new[] { imageParameters, textParameters }, new Vector3(-30, 18, 0)); var toolsTest = graphControler.SpawnVertex <BillboardVertex, BillboardVertexParameters>(vertexParameters); toolsTest.gameObject.AddComponent <Button3D>().Action = (gameObject) => SceneLoader.Instance.LoadScene <ToolTestTasks>(); text = textTextureFactory.MakeTextTexture("Movement test", true); textParameters = new BillboardParameters(text, Vector4.zero, new Vector2(4, 0.4f), isMonoColor: true, monoColor: Color.white, useCache: false); vertexParameters = new BillboardVertexParameters(new[] { imageParameters, textParameters }, new Vector3(-20, 9, 0)); var movementTest = graphControler.SpawnVertex <BillboardVertex, BillboardVertexParameters>(vertexParameters); movementTest.gameObject.AddComponent <Button3D>().Action = (gameObject) => SceneLoader.Instance.LoadScene <MovementTestTask>(); movementTest.Link <StretchableEdge, StretchableEdgeParameters>(toolsTest, new StretchableEdgeParameters(new StretchableEdgeMaterialParameters(Color.green), new SpringParameters(1, 5))); } { var graph = new GameObject("Beautiful scenes"); var graphControler = graph.AddComponent <GraphForBillboardVertexes>(); graphControler.ColliderEnable = false; Graphs.Add(graphControler); var baseScale = Vector2.one; graphControler.SetupParams(new GraphParameters(new Vector3(20, 0, 0), "Beautiful scenes")); var text = textTextureFactory.MakeTextTexture("Plants Kingdom", true); var mainTexture = Texture2DExtension.ResizeTexture(Resources.Load <Texture2D>(_mainTexture), 400, 400); var imageParameters = new BillboardParameters(mainTexture, Vector4.zero, new Vector2(9, 2), useCache: true); var textParameters = new BillboardParameters(text, Vector4.zero, new Vector2(4, 0.4f), useCache: false, isMonoColor: true, monoColor: Color.white); var vertexParameters = new BillboardVertexParameters(new[] { imageParameters, textParameters }, new Vector3(10, 10, 0)); var v1 = graphControler.SpawnVertex <BillboardVertex, BillboardVertexParameters>(vertexParameters); v1.gameObject.AddComponent <Button3D>().Action = (gameObject) => SceneLoader.Instance.LoadScene <PlantsKingdom>(); text = textTextureFactory.MakeTextTexture("Social graph 1", true); textParameters = new BillboardParameters(text, Vector4.zero, new Vector2(4, 0.4f), isMonoColor: true, monoColor: Color.white, useCache: false); vertexParameters = new BillboardVertexParameters(new[] { imageParameters, textParameters }, new Vector3(30, 19, 0)); var v2 = graphControler.SpawnVertex <BillboardVertex, BillboardVertexParameters>(vertexParameters); v2.gameObject.AddComponent <Button3D>().Action = (gameObject) => SceneLoader.Instance.LoadScene <OneGroupEnemyAndFriendsScene>(); text = textTextureFactory.MakeTextTexture("Social graph 2", true); textParameters = new BillboardParameters(text, Vector4.zero, new Vector2(4, 0.4f), isMonoColor: true, monoColor: Color.white, useCache: false); vertexParameters = new BillboardVertexParameters(new[] { imageParameters, textParameters }, new Vector3(20, 28, 0)); var v3 = graphControler.SpawnVertex <BillboardVertex, BillboardVertexParameters>(vertexParameters); v3.gameObject.AddComponent <Button3D>().Action = (gameObject) => SceneLoader.Instance.LoadScene <MultyGroupFriendsScene>(); v1.Link <StretchableEdge, StretchableEdgeParameters>(v2, new StretchableEdgeParameters(new StretchableEdgeMaterialParameters(Color.green), new SpringParameters(1, 5))); v2.Link <StretchableEdge, StretchableEdgeParameters>(v1, new StretchableEdgeParameters(new StretchableEdgeMaterialParameters(Color.green), new SpringParameters(1, 5))); v1.Link <StretchableEdge, StretchableEdgeParameters>(v3, new StretchableEdgeParameters(new StretchableEdgeMaterialParameters(Color.green), new SpringParameters(1, 5))); v3.Link <StretchableEdge, StretchableEdgeParameters>(v1, new StretchableEdgeParameters(new StretchableEdgeMaterialParameters(Color.green), new SpringParameters(1, 5))); v2.Link <StretchableEdge, StretchableEdgeParameters>(v3, new StretchableEdgeParameters(new StretchableEdgeMaterialParameters(Color.green), new SpringParameters(1, 5))); v3.Link <StretchableEdge, StretchableEdgeParameters>(v2, new StretchableEdgeParameters(new StretchableEdgeMaterialParameters(Color.green), new SpringParameters(1, 5))); } }
private static void CreateSpriteSheetAtlasUniform() { List <Texture2D> textures = new List <Texture2D> (); Object[] selectedObjects = Selection.objects; foreach (Object obj in selectedObjects) { if (obj is Texture2D) { TextureImporter importer = (TextureImporter)AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(obj)); if (importer != null) { importer.textureType = TextureImporterType.Default; importer.npotScale = TextureImporterNPOTScale.None; importer.textureFormat = TextureImporterFormat.RGBA32; importer.mipmapEnabled = false; importer.isReadable = true; AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(obj)); AssetDatabase.Refresh(); } textures.Add(obj as Texture2D); } } textures.Sort((x, y) => string.Compare(x.name, y.name)); string path = AssetDatabase.GetAssetPath(textures[0]); path = path.Remove(path.LastIndexOf('/')); Vector2 maxSize = Texture2DExtension.GetMaxSize(textures.ToArray()); float max = (maxSize.x > maxSize.y ? maxSize.x : maxSize.y); int framesPerLine = Mathf.CeilToInt(Mathf.Sqrt(textures.Count)); int textureSize = Mathf.CeilToInt(framesPerLine * max); Texture2D atlas = new Texture2D(textureSize, textureSize, TextureFormat.RGBA32, false); Color[] colors = new Color[textureSize * textureSize]; for (int i = 0; i < colors.Length; i++) { colors[i] = Color.clear; } atlas.SetPixels(colors); atlas.Apply(); Rect[] rects = atlas.PackTextures(textures.ToArray(), 0, true); byte[] bytes = atlas.EncodeToPNG(); System.IO.File.WriteAllBytes(path + "/atlas.png", bytes); AssetDatabase.Refresh(); TextureImporter tempImporter = (TextureImporter)AssetImporter.GetAtPath(path + "/atlas.png"); if (tempImporter != null) { tempImporter.textureType = TextureImporterType.Sprite; tempImporter.spriteImportMode = SpriteImportMode.Multiple; tempImporter.maxTextureSize = textureSize; int count = textures.Count; SpriteMetaData[] meta = new SpriteMetaData[count]; for (int i = 0; i < count; i++) { meta[i].name = i.ToString(); meta[i].alignment = (int)SpriteAlignment.Center; meta[i].pivot = Vector2.zero; meta[i].rect = rects[i]; } tempImporter.spritesheet = meta; AssetDatabase.ImportAsset(path + "/atlas.png"); AssetDatabase.Refresh(); } }
private void Awake() { _defaultTexture ??= Texture2DExtension.ResizeTexture(Resources.Load <Texture2D>(_mainTexture), 200, 200); _button.onClick.AddListener(CreateVertex); }
public GraphForBillboardVertexes CreateGraph() { var graph = new GameObject("Graph"); var graphControler = graph.AddComponent <GraphForBillboardVertexes>(); graph.AddComponent <Button3D>().Action = (g) => graphControler.StartForceBasedLayout(1000); Graphs.Add(graphControler); graphControler.SetupParams(new GraphParameters(new Vector3(-69, -15, -30), "Click me")); var customFont = Resources.Load <Font>(_fontPath); var mainTexture = Texture2DExtension.ResizeTexture(Resources.Load <Texture2D>(_mainTexture), 200, 200); mainTexture.name = "Target"; var textTextureFactory = new TextTextureFactory(customFont, 32); var resizedTetxure = Texture2DExtension.ResizeTexture(mainTexture, 200, 200); var baseScale = Vector2.one; var imageParameters = new BillboardParameters(resizedTetxure, scale: baseScale * 3f, useCache: true); var stretchableEdgeMaterialParameters = new StretchableEdgeMaterialParameters(Color.white, true); var edgeParameters = new StretchableEdgeParameters(new StretchableEdgeMaterialParameters(Color.yellow, true), new SpringParameters(1, 5)); var coordinates = new Vector3[26] { new Vector3(-91.62799f, -2.3942585f, -43.161083f), new Vector3(-91.138885f, -3.3022366f, -17.54464f), new Vector3(-68.31055f, -9.711845f, -29.303394f), new Vector3(-71.31007f, -2.7437487f, -56.661026f), new Vector3(-45.411583f, -2.9353018f, -42.584347f), new Vector3(-47.30028f, -3.1969986f, -22.738922f), new Vector3(-64.77525f, -3.20299f, -2.5527115f), new Vector3(-49.3282f, 5.356124f, -2.7157516f), new Vector3(-37.920048f, 5.7275085f, -30.361862f), new Vector3(-52.707493f, 8.093277f, -57.873806f), new Vector3(-88.294876f, 7.605483f, -57.47967f), new Vector3(-81.45683f, 6.2511196f, -1.4397621f), new Vector3(-105.84165f, 6.152034f, -28.007107f), new Vector3(-99.75531f, 16.45427f, -11.093414f), new Vector3(-38.78393f, 16.683071f, -14.812604f), new Vector3(-40.808224f, 15.8126135f, -44.379215f), new Vector3(-73.01358f, 14.908555f, -55.7931f), new Vector3(-68.13217f, 15.000669f, 1.9544525f), new Vector3(-83.44349f, 25.460217f, -8.76181f), new Vector3(-59.4664f, 24.522339f, -10.350107f), new Vector3(-47.37295f, 23.873238f, -31.69215f), new Vector3(-92.189575f, 24.484436f, -28.520731f), new Vector3(-81.99469f, 23.73766f, -46.882977f), new Vector3(-56.52922f, 23.624348f, -43.66665f), new Vector3(-72.91645f, 30.9808f, -30.28012f), new Vector3(-93f, 20f, -42f), }; var currentVertex = new BillboardVertex[coordinates.Length]; for (var i = 0; i < coordinates.Length; ++i) { currentVertex[i] = graphControler.SpawnVertex <BillboardVertex, BillboardVertexParameters>(new BillboardVertexParameters(new[] { imageParameters }, coordinates[i])); } currentVertex[0].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[2], edgeParameters); currentVertex[1].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[2], edgeParameters); currentVertex[3].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[2], edgeParameters); currentVertex[4].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[2], edgeParameters); currentVertex[5].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[2], edgeParameters); currentVertex[6].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[2], edgeParameters); currentVertex[0].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[3], edgeParameters); currentVertex[1].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[0], edgeParameters); currentVertex[3].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[0], edgeParameters); currentVertex[4].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[5], edgeParameters); currentVertex[4].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[3], edgeParameters); currentVertex[5].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[6], edgeParameters); currentVertex[6].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[1], edgeParameters); currentVertex[7].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[8], edgeParameters); currentVertex[8].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[9], edgeParameters); currentVertex[9].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[10], edgeParameters); currentVertex[10].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[12], edgeParameters); currentVertex[11].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[7], edgeParameters); currentVertex[12].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[11], edgeParameters); currentVertex[9].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[4], edgeParameters); currentVertex[9].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[3], edgeParameters); currentVertex[10].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[3], edgeParameters); currentVertex[10].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[0], edgeParameters); currentVertex[12].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[0], edgeParameters); currentVertex[12].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[1], edgeParameters); currentVertex[11].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[1], edgeParameters); currentVertex[11].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[6], edgeParameters); currentVertex[7].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[6], edgeParameters); currentVertex[7].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[5], edgeParameters); currentVertex[8].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[5], edgeParameters); currentVertex[8].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[4], edgeParameters); currentVertex[24].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[20], edgeParameters); currentVertex[24].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[19], edgeParameters); currentVertex[24].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[18], edgeParameters); currentVertex[24].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[21], edgeParameters); currentVertex[24].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[22], edgeParameters); currentVertex[24].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[23], edgeParameters); currentVertex[20].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[19], edgeParameters); currentVertex[19].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[18], edgeParameters); currentVertex[18].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[21], edgeParameters); currentVertex[21].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[22], edgeParameters); currentVertex[22].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[23], edgeParameters); currentVertex[23].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[20], edgeParameters); currentVertex[18].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[17], edgeParameters); currentVertex[18].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[13], edgeParameters); currentVertex[21].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[13], edgeParameters); currentVertex[22].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[16], edgeParameters); currentVertex[23].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[16], edgeParameters); currentVertex[23].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[15], edgeParameters); currentVertex[20].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[15], edgeParameters); currentVertex[20].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[14], edgeParameters); currentVertex[19].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[14], edgeParameters); currentVertex[19].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[17], edgeParameters); currentVertex[17].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[13], edgeParameters); currentVertex[16].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[15], edgeParameters); currentVertex[15].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[14], edgeParameters); currentVertex[14].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[17], edgeParameters); currentVertex[15].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[9], edgeParameters); currentVertex[15].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[8], edgeParameters); currentVertex[14].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[8], edgeParameters); currentVertex[14].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[7], edgeParameters); currentVertex[17].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[7], edgeParameters); currentVertex[17].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[11], edgeParameters); currentVertex[13].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[11], edgeParameters); currentVertex[13].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[12], edgeParameters); currentVertex[16].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[10], edgeParameters); currentVertex[16].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[9], edgeParameters); currentVertex[25].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[10], edgeParameters); currentVertex[25].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[12], edgeParameters); currentVertex[25].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[13], edgeParameters); currentVertex[25].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[21], edgeParameters); currentVertex[25].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[22], edgeParameters); currentVertex[25].Link <StretchableEdge, StretchableEdgeParameters>(currentVertex[16], edgeParameters); var text = textTextureFactory.MakeTextTexture($"Click me", true); const float scale = 20; var textParameters = new BillboardParameters(text, new Vector4(0, -5, 0, 0), new Vector2(scale, text.height * 1.0f / text.width * scale)); return(graphControler); }