private Texture GetOnTexture()
        {
            RaycastHit hit;
            bool       floor = Physics.Raycast(transform.position + Vector3.up * .01f, -Vector3.up, out hit, .2f, ~this.gameObject.layer);

            if (floor && hit.collider != collider)
            {
                if (hit.collider is TerrainCollider)
                {
                    //DO MAP
                    Terrain t = hit.collider.GetComponent <Terrain>();
                    return(t.GetTextureAt(hit.point));
                }
                else
                {
                    MeshRenderer r = hit.collider.GetComponent <MeshRenderer>();

                    if (hit.collider is MeshCollider)
                    {
                        return(r.GetMaterialAt(hit.triangleIndex, true)?.mainTexture);
                    }
                    else
                    {
                        return(r.material.mainTexture);
                    }
                }
            }
            return(null);
        }
        public void Draw(double deltaTime, Camera camera)
        {
            if (MeshRenderer == null)
            {
                return;
            }

            var drawMeshDic = new Dictionary <Material, List <SubMesh> >();

            for (var i = 0; i < MeshRenderer.MaterialCount; i++)
            {
                var mat = MeshRenderer.GetMaterialAt(i);
                drawMeshDic.Add(mat, new List <SubMesh>());
            }
            foreach (var sm in MeshRenderer.Mesh.subMeshes)
            {
                var mat = MeshRenderer.GetMaterial(sm.materialIndex);
                drawMeshDic[mat].Add(sm);
            }

            var sp = new ShaderUniqueParameter()
            {
                camera          = camera,
                cameraDir       = camera.WorldDirection,
                cameraPos       = camera.Transform.WorldPosition,
                deltaTime       = deltaTime,
                dirLight        = DirLight,
                environmentMap  = camera.EnvironmentMap,
                proj            = Projection,
                resolution      = new Vector2(MMW.Width, MMW.Height),
                projInverse     = Projection.Inverted(),
                view            = View,
                viewInverse     = View.Inverted(),
                viewProj        = View * Projection,
                viewProjInverse = (View * Projection).Inverted(),
                world           = Model,
                worldInv        = Model.Inverted(),
                skinning        = false,
                morphing        = false,
            };

            sh.UseShader();
            sh.SetUniqueParameter(sp, true);
            foreach (var mat in drawMeshDic)
            {
                mat.Key.ApplyShaderParam();
                foreach (var sub in mat.Value)
                {
                    sh.SetUniqueParameter(sp, false);
                    Drawer.DrawSubMesh(sub);
                }
            }
            sh.UnuseShader();
        }