void UpdateBatch(int lodIdx, int firstComponent, int numComponents) { int numInBatch = 0; // register any nonzero components for (int i = 0; i < numComponents; i++) { float wl = _wavelengths[firstComponent + i]; float pow = _spectrum.GetPower(wl); float period = wl / ComputeWaveSpeed(wl); float amp = Mathf.Sqrt(pow / period); if (amp >= 0.001f) { _wavelengthsBatch[numInBatch] = wl; _ampsBatch[numInBatch] = amp; _anglesBatch[numInBatch] = Mathf.Deg2Rad * (_windDirectionAngle + _angleDegs[firstComponent + i]); _phasesBatch[numInBatch] = _phases[firstComponent + i]; numInBatch++; } } if (numInBatch == 0) { // no waves to draw - abort _renderers[lodIdx].enabled = false; return; } // if we didnt fill the batch, put a terminator signal after the last position if (numInBatch < BATCH_SIZE) { _wavelengthsBatch[numInBatch] = 0f; } // apply the data to the shape material _renderers[lodIdx].enabled = true; _materials[lodIdx].SetFloatArray("_Wavelengths", _wavelengthsBatch); _materials[lodIdx].SetFloatArray("_Amplitudes", _ampsBatch); _materials[lodIdx].SetFloatArray("_Angles", _anglesBatch); _materials[lodIdx].SetFloatArray("_Phases", _phasesBatch); _materials[lodIdx].SetFloat("_NumInBatch", numInBatch); }
void UpdateMaterials() { for (int i = 0; i < _wavelengths.Length; i++) { // Wavelength _materials[i].SetFloat("_Wavelength", _wavelengths[i]); // Amplitude float pow = _spectrum.GetPower(_wavelengths[i]); float period = _wavelengths[i] / ComputeWaveSpeed(_wavelengths[i]); _amplitudes[i] = Mathf.Sqrt(pow / period); _materials[i].SetFloat("_Amplitude", _amplitudes[i]); // Direction _materials[i].SetFloat("_Angle", Mathf.Deg2Rad * (_windDirectionAngle + _angleDegs[i])); // Phase _materials[i].SetFloat("_Phase", _phases[i]); } }