Пример #1
0
        public byte Register(Vector3 Color, Vector3 Specular, float Roughness, float EmissiveWatts)
        {
            set[offset].color     = Color;
            set[offset].specular  = Specular;
            set[offset].roughness = Roughness;
            set[offset].watts     = EmissiveWatts;

            unsafe
            {
                float *f_p = (float *)voxelData.Update();
                f_p[offset * 8 + 0] = Color.X;
                f_p[offset * 8 + 1] = Color.Y;
                f_p[offset * 8 + 2] = Color.Z;
                f_p[offset * 8 + 3] = Roughness;
                f_p[offset * 8 + 4] = Specular.X;
                f_p[offset * 8 + 5] = Specular.Y;
                f_p[offset * 8 + 6] = Specular.Z;
                f_p[offset * 8 + 7] = EmissiveWatts;
                voxelData.UpdateDone();
            }

            return(offset++);
        }
Пример #2
0
        public void Update()
        {
            unsafe
            {
                byte * b_ptr;
                float *f_ptr;

                b_ptr = pointLights_buffer.Update();
                f_ptr = (float *)b_ptr;
                for (int i = 0; i < pointLights.Count; i++)
                {
                    if (pointLights[i].Dirty)
                    {
                        f_ptr[(PointLight.Size * i) / sizeof(float) + 0] = pointLights[i].Position.X;
                        f_ptr[(PointLight.Size * i) / sizeof(float) + 1] = pointLights[i].Position.Y;
                        f_ptr[(PointLight.Size * i) / sizeof(float) + 2] = pointLights[i].Position.Z;

                        f_ptr[(PointLight.Size * i) / sizeof(float) + 3] = pointLights[i].Intensity;

                        f_ptr[(PointLight.Size * i) / sizeof(float) + 4] = pointLights[i].Color.X;
                        f_ptr[(PointLight.Size * i) / sizeof(float) + 5] = pointLights[i].Color.Y;
                        f_ptr[(PointLight.Size * i) / sizeof(float) + 6] = pointLights[i].Color.Z;

                        pointLights[i].Dirty = false;
                    }
                }
                pointLights_buffer.UpdateDone();
                pointLightCnt = pointLights.Count;

                b_ptr = spotLights_buffer.Update();
                f_ptr = (float *)b_ptr;
                for (int i = 0; i < spotLights.Count; i++)
                {
                    if (spotLights[i].Dirty)
                    {
                        f_ptr[(SpotLight.Size * i) / sizeof(float) + 0] = spotLights[i].Position.X;
                        f_ptr[(SpotLight.Size * i) / sizeof(float) + 1] = spotLights[i].Position.Y;
                        f_ptr[(SpotLight.Size * i) / sizeof(float) + 2] = spotLights[i].Position.Z;

                        f_ptr[(SpotLight.Size * i) / sizeof(float) + 3] = spotLights[i].Intensity;

                        f_ptr[(SpotLight.Size * i) / sizeof(float) + 4] = spotLights[i].Direction.X;
                        f_ptr[(SpotLight.Size * i) / sizeof(float) + 5] = spotLights[i].Direction.Y;
                        f_ptr[(SpotLight.Size * i) / sizeof(float) + 6] = spotLights[i].Direction.Z;

                        f_ptr[(SpotLight.Size * i) / sizeof(float) + 7] = (float)Math.Cos(spotLights[i].Angle);

                        f_ptr[(SpotLight.Size * i) / sizeof(float) + 8]  = spotLights[i].Color.X;
                        f_ptr[(SpotLight.Size * i) / sizeof(float) + 9]  = spotLights[i].Color.Y;
                        f_ptr[(SpotLight.Size * i) / sizeof(float) + 10] = spotLights[i].Color.Z;

                        spotLights[i].Dirty = false;
                    }
                }
                spotLights_buffer.UpdateDone();
                spotLightCnt = spotLights.Count;

                b_ptr = direcLights_buffer.Update();
                f_ptr = (float *)b_ptr;
                for (int i = 0; i < direcLights.Count; i++)
                {
                    if (direcLights[i].Dirty)
                    {
                        f_ptr[(DirectionalLight.Size * i) / sizeof(float) + 0] = direcLights[i].Direction.X;
                        f_ptr[(DirectionalLight.Size * i) / sizeof(float) + 1] = direcLights[i].Direction.Y;
                        f_ptr[(DirectionalLight.Size * i) / sizeof(float) + 2] = direcLights[i].Direction.Z;

                        f_ptr[(DirectionalLight.Size * i) / sizeof(float) + 3] = direcLights[i].Intensity;

                        f_ptr[(DirectionalLight.Size * i) / sizeof(float) + 4] = direcLights[i].Color.X;
                        f_ptr[(DirectionalLight.Size * i) / sizeof(float) + 5] = direcLights[i].Color.Y;
                        f_ptr[(DirectionalLight.Size * i) / sizeof(float) + 6] = direcLights[i].Color.Z;


                        direcLights[i].Dirty = false;
                    }
                }
                direcLights_buffer.UpdateDone();
                direcLightCnt = direcLights.Count;
            }
        }