Commit Graph

662 Commits

Author SHA1 Message Date
Jozufozu
395f4b1dfc Based crumbling
- Fix crumbling on instancing engine by passing a baseInstance uniform
2024-03-29 17:40:49 -07:00
Jozufozu
227d753e73 High noon
- Draw! meshes in contractual order on instancing engine
- Rename DrawSet -> InstancedRenderStage and consolidate associated code
  inside the class
- Re-use GroupKey between engines
- Sort instanced draws based on material and mesh index in model
- Make doCrumblingSort abstract on the instancer class and re-use it
  between engines
2024-03-29 16:33:06 -07:00
Jozufozu
96eb5ea47c Less omissions in mesh emission
- Cannibalize shade separated vertex consumer to function as the mesh
  emitter for baked model buffering
- Create one MeshEmitter per chunk RenderType to allow more coherency
  during multi block buffering
- MeshEmitters own BufferBuilders, and the buffering functions call
  #begin on the mesh emitters directly
- Each time the emitter sees a quad with a different shade flag than the
  previous run of quads, it emits a mesh and begins again
- Finally, the buffering functions call #end on the mesh emitters to
  emit trailing meshes and clear transient state
- Add diffuse debug mode
- Order indirect draws by mesh index first
- Remove non-shade separated option from buffering utilities because it
  allows you to opt in to incorrect behaviour
- Remove TessellatedModel
- Document mesh ordering contract in Model
2024-03-26 12:06:20 -07:00
Jozufozu
183ea1f0f8 Get reset visual
- Remove Visual#shouldReset and associated logic
- Instead, delete and add visuals when the level renderer is notified
  of a block state change (that has a block entity)
- This does remove some control from BEVs, but it greatly simplifies the
  API and API contract
2024-03-25 12:45:53 -05:00
Jozufozu
f0cbce0ae4 24w13oneSectionAtATime
- Hook into ClientChunkCache#onLightUpdate for light updates to be
  compatible with both vanilla and starlight at once
- Bump embeddium/occulus versions
- Move embedding uniform names to static finals and fix culling program
  complaining about missing uniform names
- Light minecart visuals on init
2024-03-25 11:26:36 -05:00
Jozufozu
5775eb863f Single file
- Upload instancers and model indices in separate loops in an
  IndirectCullingGroup
- Reset changed bitset and update last* in separate method
- Don't need to upload instances anymore if the model index changes
2024-03-24 15:30:22 -05:00
Jozufozu
ff7130c71c We need to go deeper
- Compose transformations of embeddings
- Make EmbeddedEnvironment abstract and move light stuffs into
  TopLevelEmbeddedEnvironment
- Add NestedEmbeddedEnvironment that only handles matrices, and tracks
  a parent EmbeddedEnvironment
- AbstractEmbeddedEnvironment handles most of the deletion/update logic,
  and also creates further NestedEmbeddedEnvironments
- EnvironmentStorage now only tracks environments and does not creat
  them.
2024-03-24 15:05:19 -05:00
PepperCode1
277597d6bf The uintification
- Store packed instances in a uint[] in indirect
  - Split the object buffer into an instance buffer and a model index
buffer
  - Rename StructInstanceComponent to SsboInstanceComponent
  - Expand abstraction in InstanceAssemblerComponent to allow both types
of instance assemblers to reuse per-element unpacking generation
- Separate FlwInstance struct generation into separate component,
InstanceStructComponent
  - Also inline LayoutInterpreter into this class
- Move necessary internal definitions for components from api_impl to
common components_header shaders
- Use the same api_impl shader between pipelines
2024-03-24 12:36:48 -07:00
Jozufozu
84515316a7 Smart lighting
- Do not delete light volume memory when invalidated. Keep the block
  around, and then use it again later when we collect more light
- Do not allocate fresh memory blocks when growing a light volume. Turns
  out self-blitting is perfectly fine since we always start from the
  volume's origin
- Inline BoxSet back into light volume. The precise tracking it did is
  no longer relevant now that the embedding api has been simplified
- Light volumes now directly
2024-03-22 13:42:47 -05:00
Jozufozu
cfe6f3901b Like a game of telephone
- Fix overlay via casting
- Saw cortex doing this in nvidium, and it seems obvious in hindsight
2024-03-08 16:06:24 -08:00
Jozufozu
e7a112d773 Embeddebug
- Simplify light invalidation api/impl
  - There are 2 use cases for invalidating collected light:
    - The embedding visual receives a light update
    - The embedding visual moves
  - In either case, it's in the visual's best interest to re-collect any
    light it might need, rather than relying on the impl to copy
    potentially outdated light.
  - Do not sample the light volume if no light is collected
- Improve debug modes
  - Calculate colors in the fragment shader to reflect any per-fragment
    material/embedding alterations to the vertex output
  - Fix light volume debug mode spewing rainbow seizure garbage
  - Add light color debug mode
2024-03-08 13:01:58 -08:00
Jozufozu
2b39b13744 Reset off offsets
- Fix frame uniforms reserving too much space
- Fix level uniforms reserving too little space
- Actually move flw_constantAmbientLight to level uniforms
2024-03-08 12:55:07 -08:00
Cyan
04e66cad59 Add More Uniforms (#231)
Squashed commit history:

* Add basic view.h matrices

* Add last values

* Add clean matrices

* Finish adding most view.h things to frame.glsl

* Document cameraIn- uniforms

* Add options uniform

* Begin on player uniforms

* Add more player uniforms

* Add level uniforms

* Fix uniform bindings

* Update options

* Fix offset alignments

* Add new uniforms to cull shader

* Fix simple things

* Make alpha 1 if team exists but does not have a color

* Fix mixin method names

* Provide all uniforms to cull shaders

* Move constant ambient light uniform to level group

* Level uniforms gets context from context

* Remove `clean` matrices for now
2024-03-05 16:42:51 -08:00
Jozufozu
8c5c89921d Collector's edition
- Track exactly what blocks are contained in a light volume via BoxSet
- Fix segfault when a volume is expanded
- Shrink the volume when enough data is discarded
  - I think the texture management is broken for this case
2024-03-03 21:36:59 -08:00
Jozufozu
e4df896710 Protect the environment
- Environment/Embedding ownership is complicated, reference counting to
  the rescue!
  - VisualEmbeddings are acquired on construction and deleted manually
  - Instancers acquire/delete their environments
  - EmbeddedEnvironment now has three (3) delete methods
- Add EnvironmentStorage to create, track, update, and delete
  environments
- Remove InstancingEngine/IndirectEngine and move shared logic to
  EngineImpl
  - There's probably more that can be done to make DrawManager cleaner
    now
2024-03-03 14:53:07 -08:00
Jozufozu
b90b80c8b0 Turn it up to 11
- Consolidate context shaders into the common shaders, guarded by ifdefs
- Make ContextShaders into an enum
- Cache shaders by name instead of SourceComponents so the defines for
  contexts actually get compiled
- Move all embedding stuff into backend.embed
- Cannibalize GPULightVolume into an api better suited for environments
- Separate light storage from 3d texture management
- Add #delete to Environment
- Add light volume debug mode
2024-03-03 13:14:41 -08:00
Jozufozu
5d142d2f13 Thought I'd need this
- Consolidate common logic from transfer list and scatter list into
  MemoryBuffer
2024-03-03 12:29:25 -08:00
PepperCode1
64aa8d4242 The end of issues with big endianness
- Fix unpacking of some layout elements (only for instancing)
  - All byte backed and short backed elements (incorrect assumption that
system is little endian)
  - All signed byte and signed short elements (missing sign extension)
  - Matrices with byte backed and short backed reprs in some cases
(incorrect assumption that matrix rows are 4 byte aligned)
  - IntegerRepr.INT scalar (invalid implicit cast)
  - FloatRepr.NORMALIZED_INT scalar (missing cast to signed int)
  - IntegerRepr.INT vector (invalid implicit cast)
  - FloatRepr.NORMALIZED_INT vector (missing cast to signed int)
  - FloatRepr.NORMALIZED_SHORT vector (incorrect divisor)
- Add explicit casts from uint to float since some drivers have a bug
where uint over float division is invalid
- Lower GLSL requirement of instancing from 420 to 330
- Fix lib instance writers assuming little endian when writing overlay
and light
- Move overlay clamping to vertex input shader and clamp to 15 instead
of 10
- Create abstract InstanceAssemblerComponent class
- Change return type of SourceComponent.name() to String and improve
implementations
2024-03-03 11:16:38 -08:00
PepperCode1
115aad3d40 Multi-improvements
- Make lib instance shaders multiply color value instead of overriding
it
- Improve MultiBlockModelBuilder
  - Accept an Iterable<BlockPos> instead of a
Collection<StructureBlockInfo> and assume all block state data is
already contained within the render world
  - Accept a Function instead of a Map as the model data lookup
  - Allow enabling fluid rendering (all rendered fluids are currently
unshaded)
- Refactor VirtualEmptyBlockGetter
  - Move elementary implementations into abstract VirtualBlockGetter
class
  - Extract virtual LevelLightEngine into separate VirtualLightEngine
class with ability to lookup light values per pos
  - Turn VirtualEmptyBlockGetter into a class and make all methods final
to ensure instances of this class are actually empty even if subclassed
- Make BakedModelBufferer class package private
- Remove unused VertexTransformations class
- Remove Experimental annotation from
VisualizationContext.createEmbedding
2024-02-29 16:25:20 -08:00
PepperCode1
c3307630b2 A different type of translation
- Display actual backend instead of preferred backend when checking
backend
- Remove engine message and use standard messages that display backend
ID
- Simplify command code
- Replace all literal components with translatable components
- Pass 1 instead of 0 for partialTick on tick
- Extract base AtomicReferenceCounted and ReferenceCounted abstract
classes
- Double buffer capacity instead of adding constant on resize in
VertexWriter
- Move Samplers class from backend.engine to backend
2024-02-28 21:41:16 -08:00
Jozufozu
c931e84b65 More simpler
- Remove Plan#simplify and associated tests
- Neat idea but ineffective in practice
- Should reduce the user burden of implementing plans
2024-02-28 21:23:47 -08:00
Jozufozu
bd70b89621 Backend into a corner
- Make VisualizationContext, InstancerProvider, VisualEmbedding all
  BackendImplemented
- Add Engine#createVisualizationContext
- Remove Engine#instancer and variants
- VisualEmbeddings are created by backends, and data will be pushed into
  them by visuals.
- VisualEmbedding extends VisualizationContext
- The implementation of VisualEmbedding also implements Environment
- Environment is an internal replacement for Context
- Instancers are keyed by Environments
- Default environment is a noop essentially
2024-02-26 18:41:55 -08:00
Jozufozu
4d216b6672 A sample of what's to come
- Clean up texture binder stuff that's no longer needed
- Move all sampler binding to program link time
- Centralize sampler bindings/names to Samplers
- Move diffuse, light, and overlay textures into the api
- Add builder for context shader
- Fix generated_indirect -> generated_instancing
2024-02-26 15:38:11 -08:00
Jozufozu
2c3b4c54ca Stay inline
- Inline all unnecessary context stuff
- Move ContextShaders into backend.compile
- Instancers are parameterized by a nullable VisualEmbedding
  - I don't like this, but the code currently compiles, so I want a
    checkpoint before I try my next idea
2024-02-26 14:50:58 -08:00
Jozufozu
e55d506511 Sanstexts
- Add EmbeddedLevel to api
- Move all context api/lib stuffs into backend
- Move context shaders into internal
- Inline Shader and TextureSource interfaces
- Move matrix bounding sphere transform into util
- Add uniforms to cull shader to allow it to work with embedded levels
- Engine has 2 instancer methods, one that accepts an EmbeddedLevel and
  one without the parameter
- Change VisualizationContext#withContext to #embed
- Remove crumbling stuff from Contexts
2024-02-25 15:42:20 -08:00
Jozufozu
94ae32b9a7 Burning a house to kill a spider
- Fix garbage indices on instancing engine
- glDrawElements* wants indices as a byte offset, we were giving it
  a word offset
- Rename BufferedMesh -> PooledMesh
- PooledMesh no longer stores things it can fetch from the inner mesh
- Use one vao for all drawcalls in instancing engine
- PooledMesh issues *BaseVertex calls
- Move crumbling logic into InstancedDrawManager
- Move programs acquisition into InstancedDrawManager
- Move owned gl objects into InstancedDrawManager
2024-02-25 12:40:39 -08:00
Jozufozu
dd998058a3 Many to many
- Models now return a list of ConfiguredMeshes, i.e. mesh-material pairs
- BufferedMeshes now poll the index pool as needed
- Inline BufferedMesh#write
2024-02-24 17:25:01 -06:00
Jozufozu
d6abe89828 Finally room to breathe
- Expand packed overlay_light attribute into components
- Make light a short backed vec2
- Divide light input by 256 directly instead of discarding lower bits
- Remove debug overlay enum, instead only use OVERRIDE
- Add overlay debug mode
2024-02-22 14:33:57 -06:00
Jozufozu
a504aa1862 Hot links
- Do not specify layout qualifier for vertex attributes
- Bind attribute locations before linking programs
- Delete gl programs when linking fails
2024-02-22 14:02:16 -06:00
Jozufozu
c6ed7c4132 Textures your buffer
- Use texture buffers instead of instanced arrays
- Fixes issues with instance layouts using int elements
- Fixes attribute binding hardware limitations
- Create one texture for the entire instancing engine and bind each
  instancer's vbo when it's time to draw
- Generate glsl to fetch FlwInstances from a usamplerBuffer according to
  the instance layout
- Use RGBA32UI to get the most data from each texel fetch
- Align instance stride to 16 to avoid complexity in unpacking
2024-02-22 13:46:11 -06:00
Jozufozu
17130e22ea Underlay
- Clamp overlay from 0 to 10 rather than 3 to 10 to fix everything
  appearing washed out
- Fix normalized short backed float vectors being unpacked incorrectly
- Set overlay in shadow instance component to fix shadows appearing red
  - Indicative of the ivec issue being present for divisor 0 vertex
    attributes
2024-02-22 12:31:29 -06:00
Jozufozu
1dee5db9a1 Debugging broken overlay/lighting
- Break instance overlay/light back into 2 layout elements
- Write light directly as an int
- Make light a short backed float element
- Clamp overlay coords in common.frag to avoid explosions
- Explosions: integer vertex attributes sometimes blow up to massive
  sizes, greater than Short.MAX_VALUE which should not be possible.
- Reorganize some texture/uniform binding code
2024-02-21 12:37:46 -06:00
Jozufozu
aac12754cc Buffer buffers
- Do not map buffers
- Strip down GlBuffer, so it only contains upload methods
- Remove buffer mapping and copy wrappers
- Add subdata wrapper
2024-02-21 09:29:27 -06:00
Jozufozu
c61feb1c14 Cool and normal
- Reimplement normal debug mode
- Add debug mode for instance ID and light coordinates
- Pass an id into _flw_main
- Allow specifying how the debug color is applied, not sure if I want
  to keep it though
- Do not store the debug mode in config
2024-02-21 09:29:23 -06:00
Jozufozu
c4dcebb203 Pool party!
- Move index buffer logic into IndexPool class, should let us avoid
  unnecessary uploads and make it easier to manage
2024-02-20 11:09:39 -06:00
Jozufozu
aa46f6ceb1 A mesh unbound
- Clear a mesh's set of bound vaos when it's uploaded
- Fixes visual glitches on instancing when removing instances
2024-02-20 10:46:30 -06:00
Jozufozu
068692b4b9 Finding some common ground
- Make MeshPool common between instancing and indirect
- Remove empty instancers and delete meshes on indirect
- Inline IndirectModel into IndirectInstancer since it was basically
  just a thin wrapper
- Share one meshpool between all culling groups
- Always upload draw commands because the mesh may have moved
- No longer need to set the base instance in the apply shader
2024-02-19 16:51:11 -06:00
Jozufozu
e9eb468de9 Eviction notice
- For instancing, remove empty instancers and delete meshes
- Specify in InstancerProvider's contract that instancers should not be
  kept around, but reusing them within one frame in guaranteed to be
  safe
- Do all instancer updates in flush, and remove unnecessary checks that
  would be made later in the frame
- Remove isEmpty from Mesh
- Remove staging buffer param from indirect mesh pool
2024-02-19 10:53:52 -06:00
Jozufozu
456b8b66fe Unbuffers your data
- Fix null check in BakedModelBufferer
2024-02-18 17:05:17 -06:00
Jozufozu
db696f5975 No hacks here no sir
- Add VisualizationContext#withContext to formalize the way contexts are
  "pushed"
- Also push a render origin so contexts have better control over
  visuals' positions
- Make InstancerProvider NonExtendable
2024-02-18 15:27:41 -06:00
Jozufozu
55a88a89bd Revert "Apply directly to the engine!"
This reverts commit f3a88c25d5.
2024-02-18 14:05:24 -06:00
Jozufozu
53c732c3f6 Internalize
- Make *Programs#setInstance package private
2024-02-18 12:06:50 -06:00
Jozufozu
31f4ffe354 Spring cleaning
- Move PlanStorage to lib as PlanMap and add documentation
- Remove FastPlanStorage in favor of ForEachPlan
- Move plan distribution next to other distribution methods
- Rename PlanUtil -> Distribute
2024-02-18 12:03:07 -06:00
Jozufozu
e5a0e35141 Apply directly to the engine!
- Move Engine#intancer to DirectInstancerProvider interface
- InstancerProvider allows access to the DirectInstancerProvider it's
  wrapping. This is to allow mods to change the context or RenderStage
  if they need
- Mark new methods and interfaces as experimental
- Should we mark them for removal in version 2?
- Remove NonExtendable from some context interfaces
2024-02-17 11:36:43 -07:00
Jozufozu
dcecc9672d Plans all the way down
- Remove PlannedVisual
- Dynamic/Tickable visuals create plans
- Add Simple*Visual to lib to replace the old api interfaces
- Better dynamic plan storage, no need to optimize on every change
- Special case the Simple*Visuals in Storage as to not lose performance
- Needs better documentation
- Add RunnablePlan
2024-02-16 21:17:17 -08:00
Jozufozu
464deff42e Oopershaders
- Do not crash when an ubershader'd component is missing
- Reset instancing/indirect programs immediately on reload to invalidate
  them in case ubershader loading fails
2024-02-16 13:58:04 -08:00
Jozufozu
f912be4834 NEA: Not Enough Attributes
- Transformed had snuck up to attribute location 17
- Combine overlay and light attributes into one
- Flip order of overlay and light in instances to be consistent with
  the internal vertex layout
2024-02-16 13:34:34 -08:00
Jozufozu
6dfd5ed563 Taking textures back out of context
- Contexts shouldn't be responsible for binding the api defined textures
- Move light and overlay binding to TextureBinder
- Clean up & standardize material/texture setup/teardown calls
- Revert removal of MaterialRenderState texture stuff
- Add SimpleContext + Builder
- Rename Textures -> TextureSource
- Add API methods to set basic float uniforms, more to come later
- Throw errors if a context tries to set uniforms/textures with reserved
  names.
2024-02-12 23:00:40 -08:00
Jozufozu
1028ca4633 Putting crumbling in context
- Oops didn't actually put everything in last time.
- Create one context per crumbling stage.
- Let contexts handle setting both the diffuse and crumbling texture.
2024-02-11 20:49:30 -08:00
Jozufozu
bab0448724 Putting everything in context
- Begin context refactor.
- Rename (old) Context -> ContextShader and remove gl program method.
- Add (new) Context which does not need to be registered.
- Contexts are responsible for binding textures given a material.
- Instancers are created in a specific context.
- Add Shader interface for attaching textures.
- Add Textures interface for fetching textures to pass to a Shader.
- Remove texture related code from MaterialRenderState.
- Key culling groups by context.
- Key DrawSets by context.
2024-02-11 17:49:32 -08:00