[x3d-public] VariationPhysicsModel for ParticleSystem using programmable shaders
John Carlson
yottzumm at gmail.com
Tue Apr 23 01:14:18 PDT 2024
I'm realizing the number of floats could go off the end of the array in the
shader. Hmm!
John
On Tue, Apr 23, 2024 at 3:12 AM John Carlson <yottzumm at gmail.com> wrote:
> Here are my ideas for VariationPhysicsModel implementation:
>
> Particle Physics Model XML:
>
> <VariationPhysicsModel values="2 2 5 5 0 0" varations="2 1 3 3 0.1 0.1"
> lastFrame='0' updateRate='0.1'>
> =====================
> X3D Script version. Does not do instance animation
> =====
>
> <Script DEF='Animate'>
> <field name="set_fraction" accessType="inputOnly"
> type="SFFloat"></field>
> <field name='values' type='MFFloat'
> accessType='inputOutput' value='2 2 5 5 0 0'></field>
> <field name='variations' type='MFFloat'
> accessType='inputOutput' value='2 1 3 3 0.1 0.1'></field>
> <field name='lastframe' type='SFFloat'
> accessType='inputOutput' value='0'></field>
> <field name='updaterate' type='SFFloat'
> accessType='inputOutput' value='0.1'></field>
> <![CDATA[
> ecmascript:
>
> function set_fraction(f, tm) {
> if (lastframe + updaterate < tm) {
>
> lastframe = tm;
> for (let v in values) {
> values[v] = values[v] +
> (Math.random() - 0.5) * 2 * variations[v] * 0.1;
> }
> }
> }
> ]]>
> </Script>
> ======
> Shader implementation:
> ======
> uniform float [6] values; // change to x3d_ParticleValues
>
> vec3 rose(vec3 p, float[6] values) {
> float a = values[0];
> float b = values[1];
> float c = values[2];
> float d = values[3];
> float tdelta = values[4];
> float pdelta = values[5];
> [snip]
> =======
> ComposedShader I realize I could pass all floats in one field, but the
> first 3 SFFloats don't change.
> =======
> <ComposedShader DEF="x_ite" language='GLSL'>
> <field name='chromaticDispertion'
> accessType='initializeOnly' type='SFVec3f' value='0.98 1 1.033'></field>
> <field name='cube' type='SFNode'
> accessType="initializeOnly">
> <ComposedCubeMapTexture
> USE="texture"></ComposedCubeMapTexture>
> </field>
> <field name='bias' accessType='initializeOnly'
> type='SFFloat' value='0.5'></field>
> <field name='scale' accessType='initializeOnly'
> type='SFFloat' value='0.5'></field>
> <field name='power' accessType='initializeOnly'
> type='SFFloat' value='2'></field>
> <field name='values' type='MFFloat'
> accessType='inputOutput' value='2 1 4 4 0 0'></field>
> <ShaderPart url='"../shaders/x_ite_variations.vs" "
> https://coderextreme.net/X3DJSONLD/src/main/shaders/x_ite_variations.vs"'
> type="VERTEX" containerField='parts'></ShaderPart>
> <ShaderPart url='"../shaders/commonnew.fs" "
> https://coderextreme.net/X3DJSONLD/src/main/shaders/commonnew.fs"'
> containerField='parts' type='FRAGMENT'></ShaderPart>
> </ComposedShader>
> ===============================
> Normally I would use separate variables, but I want this to be widely
> applicable. There should probably be a max array size for performance
> reasons.
> ==================================
> You can see most of my current changes on my
> https://github/coderextreme/x_ite repo.
>
> Here's my current demo:
>
> https://coderextreme.net/X3DJSONLD/src/main/html/particles.html
>
> On Mon, Apr 22, 2024 at 8:21 PM John Carlson <yottzumm at gmail.com> wrote:
>
>> My thought is to add a new input variable in to shader,
>>
>> in float[] myVariable;
>>
>> Then provide
>>
>> <field name=“myVariable” type=“MFFloat” accessType=“inputOnly” value=“…”/>
>>
>> In the ComposedShader.
>>
>> But I don’t know currently how to tie a particle physics model to a
>> composed shader, nor how to address instances of geometry. The work I’ve
>> done so far addresses all instances, and uses scripts, not wind.
>>
>> So I need to look into source code a bit.
>>
>> It would seem that naming individual floats might provide better
>> documentation. I guess an MFFloat is less wordy, and a single float
>> MFFloat can serve as an SFFloat.
>>
>> John
>>
>> On Mon, Apr 22, 2024 at 7:53 PM John Carlson <yottzumm at gmail.com> wrote:
>>
>>> Also, one could provide Variational Physics Models that apply to all
>>> particles or one particle.
>>>
>>> WindPhysicsModel already does this, but the 6 variational physics models
>>> I’m imagining affects each particle.
>>>
>>> I’ll probably start coding this up tonight, if no one else volunteers.
>>>
>>> I don’t know if I need a Script per particle or not. I’m thinking I
>>> need to provide toNode and toField (ROUTEs), but on a particle level, so
>>> perhaps I need a specialized ROUTE.
>>>
>>> How might we combine this with InstancedShape? Can we add
>>> ParticleSystems’ PhysicsModels to InstancedShape?
>>>
>>> I’m looking for more collaboration on reducing the number of Scripts I
>>> use.
>>>
>>> I’m now seeing that float arrays are a thing in custom shaders, so
>>> perhaps for my 6 shader parameters, a single variational physics model is
>>> all that is required, with 2 MFFloats, one for values, and one for
>>> variation of values.
>>>
>>> Thanks!
>>>
>>> John
>>>
>>> On Mon, Apr 22, 2024 at 7:24 PM John Carlson <yottzumm at gmail.com> wrote:
>>>
>>>> Holger, I would like to provide 2 sets of (SFVec3f of values as well as
>>>> an SFVec3f of variation corresponding to the values). My thought is to use
>>>> PhysicsModels in the ParticleSystems. These are not emitters, but
>>>> something more like a WindPhysicsModel, they parametrically alter the shape
>>>> of geometry over time in a ComposedShader. There are actually 6 individual
>>>> SFFloats of values, so technically, I might use 6 WindPhysicsModels,
>>>> sending speed into the programmable shader, and providing gustiness for
>>>> variation. But this is not wind, and AFAIK, X_ITE and Sunrize does wind
>>>> with the WindPhysicsModel. Is there another PhysicsModel available, or
>>>> should I write my own?
>>>>
>>>> Would it be better to use 2 MFFloats, and how do I send an MFFloat to
>>>> the ComposedShader?
>>>>
>>>> Thanks!
>>>>
>>>> John
>>>>
>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20240423/572c32dd/attachment.html>
More information about the x3d-public
mailing list