[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