protected override void Render(Canvas canvas, double dt) { var view = _camera.ViewMatrix; foreach (var obj in _objects) { var world = obj.WorldMatrix; var worldViewProjection = world * view * _projection; void VertexShader(in Face face, out Vertex vertex, out Vector4 projection) { var position = obj.Model.Vertices[face.Vertex]; var normal = obj.Model.Normals[face.Normal]; var uv = face.Texture < 0 ? Vector2.Zero : obj.Model.TextureCoords[face.Texture]; projection = worldViewProjection * (position, 1); normal = (world * (normal, 0)).XYZ.Normalized; vertex = new Vertex { Normal = normal, UV = uv }; } void PixelShader(Material material, in Vertex input, out Vector3 color) { var shade = Vector3.Dot(input.Normal, _lightDirection); shade = Math.Min(1, Math.Max(0, shade * _lightIntensity + (1 - _lightIntensity))); color = material.DiffuseColor * shade; if (material.AmbientTexture != null) { color = material.AmbientTexture[input.UV] * shade; } } if (_wireframe) { WireframeRenderer.Render( canvas, obj.Model, obj.WorldMatrix * view * _projection, Pixel.Red ); } else { FillingRenderer.Render <Vertex>( canvas, obj.Model.Faces, obj.Model.Triangles, VertexShader, PixelShader, CullingMode.Clockwise ); } } }
void createObjects() { dropdown.options.Clear(); //want to set the color here, but don't have time to figure this out //dropdown.GetComponent("Label").GetComponent<Text>().color = color; for (int i = 0; i < ParticleCount; i++) { //spheres GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere); sphere.name = names[i]; sphere.transform.position = positions[i]; sphere.transform.localScale = new Vector3(sizes[i], sizes[i], sizes[i]); sphere.transform.SetParent(transform); WireframeRenderer wr = sphere.AddComponent <WireframeRenderer>(); wr.LineColor = color; wr.Scale = sizes[i]; wr.Center = positions[i]; wr.ShowBackFaces = true; // wr.enabled = false; // var renderer = sphere.GetComponent<Renderer>(); // renderer.sharedMaterial = material; // renderer.sharedMaterial.color = color; /////////////////////// //also add a canvas with a label containing the name // Canvas //https://docs.unity3d.com/ScriptReference/Canvas.html GameObject myGO = new GameObject(); myGO.name = "Canvas"; myGO.transform.SetParent(sphere.transform); //myGO.transform.position = new Vector3(positions[i].x, positions[i].y + 0.1f, positions[i].z); Canvas myCanvas = myGO.AddComponent <Canvas>(); //myCanvas.renderMode = RenderMode.ScreenSpaceOverlay; myCanvas.renderMode = RenderMode.WorldSpace; myCanvas.transform.localPosition = new Vector3(0f, 1f, 0f); //not sure what the units are here // myGO.AddComponent<CanvasScaler>(); // myGO.AddComponent<GraphicRaycaster>(); // Text GameObject myText = new GameObject(); myText.name = "Text"; myText.transform.SetParent(myGO.transform); myText.transform.localPosition = new Vector3(0f, 0f, 0f); Text text = myText.AddComponent <Text>(); text.text = names[i]; text.color = color; text.font = font; text.fontSize = fontsize; text.material = font.material; text.alignment = TextAnchor.MiddleCenter; var rectTransform = text.transform as RectTransform; rectTransform.sizeDelta = new Vector2(500f, rectTransform.sizeDelta.y); //Also I want to make the text always face the camera and also remain the same size on the screen ///////////////////// //dropdown dropdown.options.Add(new Dropdown.OptionData() { text = names[i] }); } }