This is a breaking change needed to fully implement instancing and stencil highlighting.
Previously, users would work directly with entities (on the Dart side, ThermionEntity), e.g.
final entity = await viewer.loadGlb("some.glb");
However, Filament "entities" are a lower-level abstraction.
Loading a glTF file, for example, inserts multiple entities into the scene.
For example, each mesh, light, and camera within a glTF asset will be assigned an entity. A top-level (non-renderable) entity will also be created for the glTF asset, which can be used to transform the entire hierarchy.
"Asset" is a better representation for loading/inserting objects into the scene; think of this as a bundle of entities.
Unless you need to work directly with transforms, instancing, materials and renderables, you can work directly with ThermionAsset.
55 lines
1.9 KiB
Plaintext
55 lines
1.9 KiB
Plaintext
material {
|
|
name : UnlitFixedSize,
|
|
parameters : [
|
|
{
|
|
type : mat4,
|
|
name : transform,
|
|
precision : high
|
|
},
|
|
{
|
|
type : float4,
|
|
name : baseColorFactor,
|
|
precision : low
|
|
},
|
|
{
|
|
type: float, // the number of world-space units between the camera and the (unscaled) gizmo
|
|
name: scale,
|
|
precision: low
|
|
}
|
|
],
|
|
depthWrite : true,
|
|
depthCulling : false,
|
|
shadingModel : unlit,
|
|
blending: transparent,
|
|
variantFilter : [ skinning, shadowReceiver, vsm ],
|
|
culling: none,
|
|
instanced: false,
|
|
vertexDomain: object
|
|
}
|
|
|
|
vertex {
|
|
void materialVertex(inout MaterialVertexInputs material) {
|
|
// the object should have the same size (in screen-space), no matter the distance from the camera
|
|
// scale the model-space vertex positions by the distance from the camera
|
|
vec4 modelSpace = getPosition();
|
|
vec4 worldSpace = getWorldFromModelMatrix() * modelSpace;
|
|
vec4 viewSpace = getViewFromWorldMatrix() * worldSpace;
|
|
float distanceFromCamera = length(viewSpace.xyz);
|
|
modelSpace.xyz *= (distanceFromCamera / materialParams.scale);
|
|
|
|
worldSpace = getWorldFromModelMatrix() * modelSpace;
|
|
material.worldPosition = worldSpace;
|
|
vec4 clipSpace = getClipFromWorldMatrix() * worldSpace;
|
|
clipSpace.z = 0.99f;
|
|
material.worldPosition = getWorldFromClipMatrix() * clipSpace;
|
|
}
|
|
}
|
|
|
|
fragment {
|
|
void material(inout MaterialInputs material) {
|
|
prepareMaterial(material);
|
|
material.baseColor = materialParams.baseColorFactor;
|
|
}
|
|
}
|
|
|