docs / stdlib / xpu / mesh

Stdlib index
  1. Overview
  1. Captured-borrow migration worklist (3.3.3)
  2. Owned-bind migration worklist (8.2.7)
  3. Return-side title audit — the ride-through enumeration
  4. stdlib ownership audit
  5. stdlib ownership dispositions (plan 1.3.1 / 4.3.1)

aot

  1. Components
  2. Scope
  3. Scoped

codec

  1. Base32
  2. Base64

codec / csv

  1. Csv

codec / json

  1. Json

collection

  1. ArrayList
  2. BPlusTree
  3. Cache
  4. Collectors
  5. HashMap
  6. HashSet
  7. Heap
  8. ImmutableList
  9. ImmutableMap
  10. ImmutableSet
  11. LinkedList
  12. RedBlackTree
  13. Sort

collection / ltm

  1. LtmBPlusTree

concurrent

  1. AtomicInt32
  2. AtomicInt64
  3. Channel
  4. Fiber
  5. FiberLocal
  6. Lock
  7. Mutex
  8. RwLock
  9. Semaphore
  10. Tasks

error

  1. Exception
  2. NoOptionalValueException
  3. NotProvidedException
  4. RecoverableException
  5. ScopedBuildFailedException
  6. ScopeNotActiveException
  7. Throwable
  8. UnrecoverableException

gfx

  1. Sampler
  2. Texture2D

hash

  1. DefaultHasher
  2. Hash
  3. SipHash
  4. XXHash3

ifx

  1. BackendRegistry
  2. Window

io

  1. Buffer

io / file

  1. File
  2. FileInfo
  3. FileReader
  4. FileWriter
  5. Path
  6. Watcher

io / net

  1. BufferPool
  2. ByteBuffer
  3. IpAddress
  4. Server
  5. ServerBuilder
  6. SocketAddress
  7. TcpListener
  8. TcpStream
  9. UdpSocket

io / net / dns

  1. Dns

io / net / uri

  1. Uri
  2. UriBuilder

lang

  1. Guid
  2. Math
  3. Optional
  4. Pair
  5. Slice
  6. String
  7. StringBuilder

lang / stream

  1. ArrayStream
  2. Stream

math

  1. Camera
  2. Color
  3. DType
  4. Ray
  5. Rotation
  6. Tensor
  7. Transform

math / fft

  1. Fft

math / linalg

  1. LinAlg

math / npio

  1. Npy

math / poly

  1. Poly

math / random

  1. Generator

math / stats

  1. Stats

nucleo

  1. Columns — the Arrow-laid-out substrate
  2. Fused tensor expressions — Fuse
  3. Table — the lazy, typed dataframe
  4. Tape — define-by-run autograd
  5. Transform intrinsics — Grad, Vmap, Jit

process

  1. Command
  2. Process

reflect

  1. Class

search / distance

  1. Distance

search / fuzzy

  1. Matcher

search / ngram

  1. Index

session

  1. PackageInstallException
  2. Packages

time

  1. Clock
  2. DateTimeFormatter
  3. Duration
  4. Instant
  5. LocalDate
  6. LocalDateTime
  7. LocalTime
  8. Period
  9. ZonedDateTime
  10. ZoneId
  11. ZoneOffset

wire

  1. Compressor
  2. CompressStream
  3. DecompressionLimitException
  4. Decompressor
  5. Encoder
  6. Schema
  7. SchemaEncoder

xpu

  1. Device
  2. KernelBuffer
  3. KernelStream
  4. KernelTimer

xpu / mesh

  1. MeshSimplifier

MeshSimplifier

cajeta.xpu.mesh.MeshSimplifier — the appearance-preserving Garland–Heckbert edge-collapse mesh simplifier, built on Qem. A mesh is an indexed triangle soup in the canonical vertex-buffer layout: a flat float32[] of vertex positions (x, y, z interleaved) and an int32[] of triangle corner indices (three per triangle). The simplifier proceeds in two phases: accumulate a per-vertex error quadric (accumulateQuadrics), then repeatedly collapse the cheapest edge (simplify), moving each merged vertex to its error-minimizing position — so flat regions collapse at zero cost while curved and creased regions resist. Quadrics live in a flat float32[] (16 row-major entries per vertex) because a Matrix[] cannot be allocated; vertexQuadric reconstructs one on demand.

package snip.mesh;

import cajeta.xpu.mesh.MeshSimplifier;

public final class Demo {
    public static void run() {
        // Two triangles sharing an edge: 4 vertices (x, y, z each), 6 indices.
        float32[] positions = heap float32[12];
        positions[3] = 1.0f;                      // v1 = (1, 0, 0)
        positions[7] = 1.0f;                      // v2 = (0, 1, 0)
        positions[9] = 1.0f;  positions[10] = 1.0f;   // v3 = (1, 1, 0)
        int32[] indices = heap int32[6];
        indices[1] = 1;  indices[2] = 2;          // (0, 1, 2)
        indices[3] = 1;  indices[4] = 3;  indices[5] = 2;   // (1, 3, 2)
        float32[] quadrics #= MeshSimplifier.accumulateQuadrics(positions, indices, 4);
        int32[] survivors #= MeshSimplifier.simplify(positions, indices, 4, 1);
        return;
    }
}

Methods

Signature
static #float32[] accumulateQuadrics(float32[] positions, int32[] indices, int32 vertexCount) ⚑Accumulate a Garland–Heckbert error quadric per vertex into a flat float32[] (16 row-major entries per vertex; entry v*16 + r*4 + c)
static Matrix<float32,4,4> vertexQuadric(float32[] quadrics, int32 v)Reconstruct vertex v’s accumulated quadric as a Matrix<float32,4,4> from the flat store
static #int32[] simplify(float32[] positions, int32[] indices, int32 vertexCount, int32 targetTriangleCount) ⚑Iterative edge collapse down to at most targetTriangleCount triangles, returning the surviving index list (length a multiple of 3); positions is mutated in place

⚑ = @EntryPoint

See also

Source: docs/stdlib/xpu/mesh/MeshSimplifier.md · 1 min read · 217 words