示例#1
0
        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]
            });
        }
    }