Withdraw the tie "not a joint index" claim: the measurement never settled it
Revisited an older conclusion and found the numbers were fine but the inference
from them was not.
The claim was: i16[3] in a tie vertex is not a skin/joint index, because vertices
sharing a value are 0.95x FARTHER apart than vertices differing in it.
mean pairwise distance, same slot-3 value 14,481
mean pairwise distance, different slot-3 value 13,795
ratio 0.95x
control: same position-x bucket 8,105
The measurements are correct, and the control shows the test works. What does not
follow is the conclusion. The premise was "vertices sharing a joint sit together",
and that is only true for a TIGHTLY LOCALISED joint. It is false in the cases that
are common:
* a rigid tie object -- a leaf, a banner, a piece of foliage -- puts every vertex
on joint 0, so "vertices sharing a joint" IS the whole mesh and the mean
distance is the mesh's own diameter
* a root or hip bone's influence region can span most of a mesh
* bone weights fall off gradually, so membership is not a spatial partition
A 0.95x ratio is precisely what a rigid object bound to one joint PREDICTS.
Absence of clustering is fully consistent with the joint reading; the test never
had the power to separate them. A negative result I did not expect was reported
as a disproof.
This makes the hypothesis STRONGER, for an independent reason: MobyInstance carries
jointCnt at 0x57 and jointCache at 0x58, so this engine demonstrably has joints and
per-moby joint state. A per-vertex field in 0..=254 is exactly the shape of a
joint index.
What was always established still stands, and is all that was: slot 3 is per vertex
(50 distinct values per packet) and not shared across LODs (75.3% same-class
against a 78.7% control). The LOD result is the one thing arguing against a joint
index, though two LODs binding a rigid mesh identically would produce it without
being informative.
So: not understood, with the joint reading now the LEADING CANDIDATE rather than a
disproved one. Corrected in the format file and the roadmap, including the second
mention added two commits ago.
This is the sixth correction in this session to withdraw a conclusion rather than
sharpen one, and the first where the measurement was sound and only the reading
was wrong -- which is the hardest kind to catch, because the number looks right and
is quoted in the commit message as well as the doc.
This commit is contained in:
@@ -2214,24 +2214,47 @@ single draw packet** (median, 1,804 records). A material or texture-set index
|
|||||||
would be constant per packet, so it is per vertex -- which invites the obvious
|
would be constant per packet, so it is per vertex -- which invites the obvious
|
||||||
reading: tie objects are skinned, and slot 3 is a joint index.
|
reading: tie objects are skinned, and slot 3 is a joint index.
|
||||||
|
|
||||||
That reading is wrong. If it named a joint, vertices sharing it would sit
|
> **CORRECTED.** An earlier version of this concluded "slot 3 is not a skin
|
||||||
together. They do not:
|
> index". The measurement does not support that, and the inference from it was
|
||||||
|
> wrong. The correction is the reasoning, not the numbers.
|
||||||
|
|
||||||
mean pairwise distance, same slot-3 value 14,481
|
mean pairwise distance, same slot-3 value 14,481
|
||||||
mean pairwise distance, different slot-3 value 13,795
|
mean pairwise distance, different slot-3 value 13,795
|
||||||
ratio different/same 0.95x
|
ratio different/same 0.95x
|
||||||
control: same position-x bucket 8,105
|
control: same position-x bucket 8,105
|
||||||
|
|
||||||
Vertices sharing a slot-3 value are if anything marginally *farther* apart than
|
The numbers are fine: vertices sharing a slot-3 value are about as far apart as
|
||||||
vertices differing in it -- 0.95x, the wrong side of neutral, though not far
|
vertices differing in it, and the control shows the measurement works -- bucket
|
||||||
enough to claim much on its own. The control shows the measurement works:
|
by position-x and pairs collapse to 8,105, half the global distance.
|
||||||
bucket by position-x and pairs collapse to 8,105, half the global distance.
|
|
||||||
|
|
||||||
So slot 3 is not a skin index. It is also not shared across LODs: 75.3%
|
What does not follow is "so it is not a joint index". The premise was that
|
||||||
same-class against a 78.7% control, i.e. no signal at all. Per-vertex, in
|
vertices sharing a joint sit together. That is only true for a *tightly
|
||||||
`0..=254`, correlated with neither the geometry it sits in nor the detail level.
|
localised* joint. It is false in the cases that are actually common:
|
||||||
**It is not understood**, and no reading is offered here. A per-vertex phase
|
|
||||||
would fit the arithmetic, but that is a guess and is labelled as one.
|
* a rigid tie object -- a leaf, a banner, a piece of foliage -- puts **every**
|
||||||
|
vertex on joint 0, so "vertices sharing a joint" is every vertex, and the mean
|
||||||
|
distance is the mesh's own diameter;
|
||||||
|
* a root or hip bone's influence region can span most of a mesh;
|
||||||
|
* a bone's weights fall off gradually, so membership is not a spatial partition.
|
||||||
|
|
||||||
|
A 0.95x ratio is what a rigid object bound to one joint **predicts**. Absence of
|
||||||
|
clustering is therefore fully consistent with the joint reading, and the test
|
||||||
|
never had the power to separate them.
|
||||||
|
|
||||||
|
That makes the hypothesis stronger rather than weaker, for a separate reason:
|
||||||
|
`MobyInstance` carries `jointCnt` at `0x57` and `jointCache` at `0x58`, so this
|
||||||
|
engine has joints and per-moby joint state. A per-vertex field in `0..=254` is
|
||||||
|
exactly the shape of a joint index.
|
||||||
|
|
||||||
|
What is still true, and is all that was ever established: slot 3 is **per vertex**
|
||||||
|
(50 distinct values per packet), in `0..=254`, and **not shared across LODs**
|
||||||
|
(75.3% same-class against a 78.7% control). A joint index shared across a class's
|
||||||
|
two LODs would be expected to share, which is the one thing arguing against it --
|
||||||
|
though two LODs may also bind a rigid mesh identically without that being
|
||||||
|
informative.
|
||||||
|
|
||||||
|
So: **not understood**, with the joint reading now the leading candidate rather
|
||||||
|
than a disproved one.
|
||||||
|
|
||||||
### Slots 6 and 7 are mostly not per-vertex
|
### Slots 6 and 7 are mostly not per-vertex
|
||||||
|
|
||||||
@@ -3292,9 +3315,11 @@ axis the two tables share.
|
|||||||
|
|
||||||
`jointCnt` and `jointCache` also settle something from earlier in this log by
|
`jointCnt` and `jointCache` also settle something from earlier in this log by
|
||||||
contradiction rather than confirmation. A tie vertex's `i16[3]` was tested as a
|
contradiction rather than confirmation. A tie vertex's `i16[3]` was tested as a
|
||||||
skin/joint index and **disproved** -- vertices sharing it were 0.95x *farther*
|
skin/joint index, which the measurement **did not settle** -- see the correction
|
||||||
apart than vertices differing in it. That result stands and is unaffected: this is
|
above. That earlier result was over-read, and the joint reading is now the
|
||||||
the *moby* struct, and a moby is a different object from a tie.
|
leading candidate rather than a disproved one. Either way this is the *moby*
|
||||||
|
struct and a moby is a different object from a tie, so the two are not evidence
|
||||||
|
about each other.
|
||||||
|
|
||||||
What this does **not** do is find `moby_anim`. It names the instance-side state --
|
What this does **not** do is find `moby_anim`. It names the instance-side state --
|
||||||
a sequence pointer, a layer list, a joint cache -- which means the asset to locate
|
a sequence pointer, a layer list, a joint cache -- which means the asset to locate
|
||||||
|
|||||||
+7
-4
@@ -353,10 +353,13 @@ Phase 1 hands over the extents; this phase works out what each one contains.
|
|||||||
- [~] The remaining tie vertex **fields are not named**, and two readings are now
|
- [~] The remaining tie vertex **fields are not named**, and two readings are now
|
||||||
excluded. `i16[6]`/`i16[7]` are constant across a whole draw packet in
|
excluded. `i16[6]`/`i16[7]` are constant across a whole draw packet in
|
||||||
43%/34% of records, so they are usually per-packet rather than per-vertex.
|
43%/34% of records, so they are usually per-packet rather than per-vertex.
|
||||||
`i16[3]` is per-vertex (50 distinct values per packet) but **not a skin or
|
`i16[3]` is per-vertex (50 distinct values per packet) and unshared across
|
||||||
joint index**: vertices sharing it are 0.95x *farther* apart than vertices
|
LODs (75.3% against a 78.7% control). **An earlier note here called it "not
|
||||||
differing in it, against a control that halves. It is also unshared across
|
a joint index" on a 0.95x distance ratio; that was an over-read and is
|
||||||
LODs. Recorded as not understood rather than guessed.
|
withdrawn.** A rigid object bound to joint 0 makes "vertices sharing a
|
||||||
|
joint" the whole mesh, so absence of clustering is what a joint index
|
||||||
|
predicts. With `MobyInstance.jointCnt` now named, the joint reading is the
|
||||||
|
leading candidate, not a disproved one.
|
||||||
`i16` range with 10,803-13,421 distinct values each. `i16[0..2]` are most
|
`i16` range with 10,803-13,421 distinct values each. `i16[0..2]` are most
|
||||||
likely position, but that is not established.
|
likely position, but that is not established.
|
||||||
- [~] `shrub` — class table done (48-byte entries, not 32; reading shrub at
|
- [~] `shrub` — class table done (48-byte entries, not 32; reading shrub at
|
||||||
|
|||||||
Reference in New Issue
Block a user