aboutsummaryrefslogtreecommitdiff
path: root/APEX_1.4/common/include/InstancedObjectSimulationIntl.h
diff options
context:
space:
mode:
authorgit perforce import user <a@b>2016-10-25 12:29:14 -0600
committerSheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees>2016-10-25 18:56:37 -0500
commit3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch)
treefa6485c169e50d7415a651bf838f5bcd0fd3bfbd /APEX_1.4/common/include/InstancedObjectSimulationIntl.h
downloadphysx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz
physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip
Initial commit:
PhysX 3.4.0 Update @ 21294896 APEX 1.4.0 Update @ 21275617 [CL 21300167]
Diffstat (limited to 'APEX_1.4/common/include/InstancedObjectSimulationIntl.h')
-rw-r--r--APEX_1.4/common/include/InstancedObjectSimulationIntl.h160
1 files changed, 160 insertions, 0 deletions
diff --git a/APEX_1.4/common/include/InstancedObjectSimulationIntl.h b/APEX_1.4/common/include/InstancedObjectSimulationIntl.h
new file mode 100644
index 00000000..d631589d
--- /dev/null
+++ b/APEX_1.4/common/include/InstancedObjectSimulationIntl.h
@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved.
+ *
+ * NVIDIA CORPORATION and its licensors retain all intellectual property
+ * and proprietary rights in and to this software, related documentation
+ * and any modifications thereto. Any use, reproduction, disclosure or
+ * distribution of this software and related documentation without an express
+ * license agreement from NVIDIA CORPORATION is strictly prohibited.
+ */
+
+
+#ifndef INSTANCED_OBJECT_SIMULATION_INTL_H
+#define INSTANCED_OBJECT_SIMULATION_INTL_H
+
+#include "ApexDefs.h"
+
+#include "PxTask.h"
+#include "ApexActor.h"
+#include "IofxManagerIntl.h"
+
+namespace nvidia
+{
+namespace apex
+{
+
+class RenderVolume;
+
+/* Input data structure from Emitter ==> (injector) IOS */
+struct IosNewObject
+{
+ PxVec3 initialPosition;
+ PxVec3 initialVelocity;
+ float lifetime; // in seconds
+ float lodBenefit; // filled in by injector
+ IofxActorIDIntl iofxActorID; // filled in by injector
+
+ uint32_t userData;
+};
+
+/**
+ * Note the difference between how lifetimes are provided by the emitter (in seconds), and how
+ * they are reported to the IOFX (as a percentage of time remaining). This implies a couple IOS
+ * requirements. 1) The IOS must remember the initial total lifetime and each frame do a remain/total
+ * division in order to report the percent remain. 2) In order for the liferemain to report 1.0 on
+ * the object's inital frame, new objects cannot have their remain decremented.
+ */
+
+/**
+ * An emitter will aquire an instance of this class from each IOS actor it instantiates. The IOS
+ * will hold an array of these instances to manage all of its emitters and object ID ranges.
+ */
+class IosInjectorIntl : public ApexActor
+{
+public:
+ /**
+ * An emitter calls createObjects() at the end of its tick/step function to register its newly
+ * spawned objects with the IOS. If the IOS has limits on the number of objects it can spawn each
+ * simulation step, it must provide buffering beneath this API. The IOS must copy this data if it
+ * cannot create the objects within this function call. Note that the IOFX is unaware of the
+ * object creation path, it discovers spawned objects when they show up with liferemain of 1.0
+ * An IOS may have built-in emitters that do not call this API (Turbulence).
+ */
+ virtual void createObjects(uint32_t count, const IosNewObject* createList) = 0;
+
+ /**
+ * An emitter calls setLODWeights() as often as it needs to adjust the LOD paramters for its
+ * particles.
+ */
+ // distanceWeight minimum squared distance from camera before distance is included in LOD weight
+ // speedWeight minimum velocity parameter. Particles slower than this are culled more aggressively.
+ // lifeWeight lifetime minimum limit. Particles with less lifetime than this remaining will be culled.
+ virtual void setLODWeights(float maxDistance, float distanceWeight, float speedWeight, float lifeWeight, float separationWeight, float bias) = 0;
+
+ /**
+ * When an emitter is being destroyed, it must call this release method on all of its injectors
+ * so those IOS instances can reclaim those ID ranges and destroy any active objects.
+ */
+ virtual void release() = 0;
+
+ virtual PxTaskID getCompletionTaskID() const = 0;
+
+ virtual void setPreferredRenderVolume(nvidia::apex::RenderVolume* volume) = 0;
+
+ /**
+ * Return the value of the least benefit particle to survive last frame's LOD culling.
+ * An emitter can query this value to voluntarily throttle itself. However, to prevent
+ * feedback loops it should always try to emit at least a few particles when it is
+ * throttled.
+ */
+ virtual float getLeastBenefitValue() const = 0;
+
+ virtual uint32_t getSimParticlesCount() const = 0;
+
+ /**
+ * This injector has particles in it that were unable to be inserted at the last simulation
+ * step because of an insertion limit in the IOS. The emitter may chose to throttle its
+ * emissions when this returns true.
+ */
+ virtual bool isBacklogged() const = 0;
+
+ /**
+ Returns the current number of particles/objects active in the simulation.
+ */
+ virtual uint32_t getActivePaticleCount() const = 0;
+
+ virtual void setObjectScale(float objectScale) = 0;
+
+protected:
+ virtual ~IosInjectorIntl() {}
+};
+
+
+/**
+ * Base class for all particle simulation systems and other systems that can efficiently simulate
+ * instanced geometry. This is the interface to the IOS Actor (instance).
+ */
+class InstancedObjectSimulationIntl : public ApexActor
+{
+public:
+ /**
+ * An emitter calls allocateInjector() to create an injector targeted at a particular
+ * IOFX Asset. The IOS will allocate an IOFX actor as necessary. The emitter has no
+ * knowledge of the size of the IOFX actor, or how many emitters are also using it.
+ */
+ virtual IosInjectorIntl* allocateInjector(IofxAsset* iofxAsset) = 0;
+
+ /**
+ * Query the authored radius of the instanced objects simulated by this IOS. Emitters need this
+ * value for volume fill effects and an IOFX may need it for rendering purposes.
+ */
+ virtual float getObjectRadius() const = 0;
+
+ /**
+ * Query the authored density of the instanced objects simulated by this IOS. Emitters need this
+ * value for constant density emitter effects.
+ */
+ virtual float getObjectDensity() const = 0;
+
+ /**
+ * An emitter may use this API functions to query particle positions from the most recent simulation step
+ * This IOS output buffer is updated each frame during fetchResults.
+ */
+ virtual const PxVec3* getRecentPositions(uint32_t& count, uint32_t& stride) const = 0;
+
+ /**
+ * Set's the origin of the density grid; this is implemented for BasicIOS and ParticleIOS
+ */
+ virtual void setDensityOrigin(const PxVec3& v)
+ {
+ PX_UNUSED(v);
+ }
+
+protected:
+ virtual ~InstancedObjectSimulationIntl() {}
+};
+
+}
+} // end namespace nvidia::apex
+
+#endif // #ifndef INSTANCED_OBJECT_SIMULATION_INTL_H