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++); }
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; } }