stash changes

This commit is contained in:
Piotr Goszczyński committed 2025-03-17 19:46:11 +01:00
1 parent 0a4168d6e9
commit 5cfe9e9068
5 files changed
+1492 -460

No files matched your search

+2 -2
View File
@@ -68,9 +68,9 @@ const LwCanvas = ({ className }: { className?: string }) => {
// Load the ticket texture and create the actual ticket mesh
// Replace this URL with your actual ticket texture
const ticketTextureUrl = '/images/launchweek/14/ticket-test.png'
const ticketScene = '/images/launchweek/14/ticket-supabase-positioned.gltf'
createTicketMesh(ticketTextureUrl, {
createTicketMesh(ticketScene, {
width: planeGeometrySize[0],
height: planeGeometrySize[1],
})
+70 -39
View File
@@ -7,13 +7,15 @@ import { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js'
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'
import { GlitchPass } from './glitch'
import { CRTShader } from './crt-shader'
import { FontLoader } from 'three/examples/jsm/loaders/FontLoader.js'
import { TextGeometry } from 'three/examples/jsm/geometries/TextGeometry.js'
/**
* Custom hook for managing requestAnimationFrame
* Helper to simplifies controlling requestAnimationFrame
* @param callback Animation callback function
* @returns Object with start and stop functions
*/
export const useThreeAnimation = (callback: (time?: number) => void) => {
export const createThreeAnimation = (callback: (time?: number) => void) => {
const requestRef = { current: undefined } as { current: number | undefined }
const previousTimeRef = { current: undefined } as { current: number | undefined }
@@ -47,7 +49,7 @@ export const useThreeAnimation = (callback: (time?: number) => void) => {
export const createThreeSetup = (
container: HTMLElement,
options: {
cameraPosition?: THREE.Vector3,
cameraPosition?: THREE.Vector3
postprocessing?: {
bloom?: {
enabled: boolean
@@ -200,88 +202,114 @@ export const createTicketMesh = async (
try {
const width = options.width || 4
const height = options.height || 2
// Determine if we should use texture mode
const useTextureMode = options.forceTextureMode ||
!(source.endsWith('.glb') || source.endsWith('.gltf'))
const useTextureMode =
options.forceTextureMode || !(source.endsWith('.glb') || source.endsWith('.gltf'))
if (!useTextureMode) {
// Load the GLTF model
const model = await loadGLTFModel(source)
const namedObject = model.getObjectByName('planetName')
const boxHelper = new THREE.BoxHelper(namedObject, 0xff0000) // Red outline
model.add(boxHelper) // Add to the model so it moves with it
const fontLoader = new FontLoader()
fontLoader.load('/images/launchweek/13/ticket/SourceCodePro_Regular.json', function (font) {
const textGeometry = new TextGeometry('Earth', {
font: font,
size: 96,
depth: 0.05,
})
const textMaterial = new THREE.MeshBasicMaterial({ color: 0xffffff })
const textMesh = new THREE.Mesh(textGeometry, textMaterial)
// Add text as child of your named object
if (namedObject) namedObject.add(textMesh)
else console.error('Named object not found')
// Position relative to parent
textMesh.position.set(0, 0, 0.01) // Slight offset to avoid z-fighting
})
// Calculate scale to fit the model within the specified width and height
const box = new THREE.Box3().setFromObject(model)
const size = box.getSize(new THREE.Vector3())
// Calculate scale factors to fit the model within the specified dimensions
const scaleX = width / size.x
const scaleY = height / size.y
const scale = Math.min(scaleX, scaleY)
// Apply the scale
model.scale.set(scale, scale, scale)
// Center the model
box.setFromObject(model)
const center = box.getCenter(new THREE.Vector3())
model.position.sub(center)
// Only enhance emissive properties if explicitly requested
// This respects the original GLTF materials by default
if (options.enhanceEmissive) {
model.traverse((child) => {
if (child instanceof THREE.Mesh && child.material) {
if (Array.isArray(child.material)) {
child.material.forEach(mat => {
child.material.forEach((mat) => {
if (mat instanceof THREE.MeshStandardMaterial) {
mat.emissive = options.materialOptions?.emissiveColor
? new THREE.Color(options.materialOptions.emissiveColor)
mat.emissive = options.materialOptions?.emissiveColor
? new THREE.Color(options.materialOptions.emissiveColor)
: new THREE.Color(0xffffff)
mat.emissiveIntensity = options.materialOptions?.emissiveIntensity ?? 0.2
}
})
} else if (child.material instanceof THREE.MeshStandardMaterial) {
child.material.emissive = options.materialOptions?.emissiveColor
? new THREE.Color(options.materialOptions.emissiveColor)
child.material.emissive = options.materialOptions?.emissiveColor
? new THREE.Color(options.materialOptions.emissiveColor)
: new THREE.Color(0xffffff)
child.material.emissiveIntensity = options.materialOptions?.emissiveIntensity ?? 0.2
}
}
})
}
return model
} else {
// Load as a texture
const texture = await loadTexture(source)
// Create a plane geometry for the ticket
const geometry = new THREE.PlaneGeometry(width, height)
// Create a material with the loaded texture
const material = new THREE.MeshStandardMaterial({
map: texture,
transparent: options.materialOptions?.transparent !== undefined
? options.materialOptions.transparent
: true,
transparent:
options.materialOptions?.transparent !== undefined
? options.materialOptions.transparent
: true,
side: THREE.DoubleSide,
emissive: options.materialOptions?.emissiveColor
? new THREE.Color(options.materialOptions.emissiveColor)
emissive: options.materialOptions?.emissiveColor
? new THREE.Color(options.materialOptions.emissiveColor)
: new THREE.Color(0xffffff),
emissiveIntensity: options.materialOptions?.emissiveIntensity ?? 0.2,
color: options.materialOptions?.color
? new THREE.Color(options.materialOptions.color)
color: options.materialOptions?.color
? new THREE.Color(options.materialOptions.color)
: new THREE.Color(0xffffff),
})
// Create the mesh
const mesh = new THREE.Mesh(geometry, material)
return mesh
}
} catch (error) {
console.error('Error loading model/texture:', error)
// Fallback to a simple plane with a default material if loading fails
const geometry = new THREE.PlaneGeometry(options.width || 4, options.height || 2)
const material = new THREE.MeshStandardMaterial({
@@ -291,7 +319,7 @@ export const createTicketMesh = async (
emissive: new THREE.Color(0xffffff),
emissiveIntensity: 0.2,
})
return new THREE.Mesh(geometry, material)
}
}
@@ -317,7 +345,7 @@ export const createTextureTicketMesh = async (
): Promise<THREE.Mesh> => {
return createTicketMesh(textureUrl, {
...options,
forceTextureMode: true
forceTextureMode: true,
}) as Promise<THREE.Mesh>
}
@@ -327,26 +355,29 @@ export const createTextureTicketMesh = async (
* @returns Object with containerRef
*/
export const useThreeJS = (
setupCallback: (container: HTMLElement) => { cleanup: () => void; animate: (time?: number) => void }
setupCallback: (container: HTMLElement) => {
cleanup: () => void
animate: (time?: number) => void
}
) => {
const containerRef = useRef<HTMLDivElement>(null)
useEffect(() => {
if (!containerRef.current) return
const container = containerRef.current
const { cleanup, animate } = setupCallback(container)
// Set up animation loop
const { start, stop } = useThreeAnimation(animate)
const { start, stop } = createThreeAnimation(animate)
start()
// Cleanup on unmount
return () => {
stop()
cleanup()
}
}, [setupCallback])
return { containerRef }
}
@@ -1,419 +0,0 @@
{
"asset": {
"version": "2.0",
"generator": "THREE.GLTFExporter"
},
"scenes": [
{
"nodes": [
0
]
}
],
"scene": 0,
"nodes": [
{
"children": [
6
],
"matrix": [
0.01,
0,
0,
0,
0,
0.01,
0,
0,
0,
0,
0.01,
0,
0,
0,
0,
1
]
},
{
"matrix": [
1,
0,
0,
0,
0,
1,
0,
0,
0,
0,
1,
0,
0,
0,
1,
1
],
"name": "Goszczu Text",
"mesh": 0
},
{
"name": "Goszczu Rectangle",
"mesh": 1
},
{
"name": "Goszczu Parent",
"children": [
1,
2
]
},
{
"matrix": [
1,
0,
0,
0,
0,
1,
-6.123233995736766e-17,
0,
0,
6.123233995736766e-17,
1,
0,
0,
6.123233995736766e-14,
1000,
1
],
"camera": 0
},
{
"matrix": [
1,
0,
0,
0,
0,
1,
0,
0,
0,
0,
1,
0,
0,
1,
0,
1
],
"name": "Default Ambient Light"
},
{
"name": "Scene 1",
"children": [
3,
4,
5
]
}
],
"bufferViews": [
{
"buffer": 0,
"byteOffset": 0,
"byteLength": 1920,
"target": 34962,
"byteStride": 12
},
{
"buffer": 0,
"byteOffset": 1920,
"byteLength": 1920,
"target": 34962,
"byteStride": 12
},
{
"buffer": 0,
"byteOffset": 3840,
"byteLength": 1280,
"target": 34962,
"byteStride": 8
},
{
"buffer": 0,
"byteOffset": 5120,
"byteLength": 852,
"target": 34963
},
{
"buffer": 0,
"byteOffset": 5972,
"byteLength": 48,
"target": 34962,
"byteStride": 12
},
{
"buffer": 0,
"byteOffset": 6020,
"byteLength": 48,
"target": 34962,
"byteStride": 12
},
{
"buffer": 0,
"byteOffset": 6068,
"byteLength": 32,
"target": 34962,
"byteStride": 8
},
{
"buffer": 0,
"byteOffset": 6100,
"byteLength": 24,
"target": 34963
}
],
"buffers": [
{
"byteLength": 6124,
"uri": "data:application/octet-stream;base64,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/NQnQrBHvcAAAAAACIGZQQRW2cEAAAAACIGZQawct8EAAAAACIGZQajxMcIAAAAAwJ9kQUA1rr8AAAAAgJUaQgRW2cEAAAAAgJUaQqwct8EAAAAARDYpQvQoRMIAAAAARDYpQqjxMcIAAAAAwJ9kQfQoRMIAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAALine truncated
}
],
"accessors": [
{
"bufferView": 0,
"componentType": 5126,
"count": 160,
"max": [
71.21400451660156,
81.43899536132812,
0
],
"min": [
-147.44700622558594,
-49.03999328613281,
0
],
"type": "VEC3"
},
{
"bufferView": 1,
"componentType": 5126,
"count": 160,
"max": [
0,
0,
1
],
"min": [
0,
0,
1
],
"type": "VEC3"
},
{
"bufferView": 2,
"componentType": 5126,
"count": 160,
"max": [
1,
1
],
"min": [
0,
0
],
"type": "VEC2"
},
{
"bufferView": 3,
"componentType": 5123,
"count": 426,
"max": [
159
],
"min": [
0
],
"type": "SCALAR"
},
{
"bufferView": 4,
"componentType": 5126,
"count": 4,
"max": [
500,
250,
0
],
"min": [
-500,
-250,
0
],
"type": "VEC3"
},
{
"bufferView": 5,
"componentType": 5126,
"count": 4,
"max": [
0,
0,
1
],
"min": [
0,
0,
1
],
"type": "VEC3"
},
{
"bufferView": 6,
"componentType": 5126,
"count": 4,
"max": [
1,
1
],
"min": [
0,
0
],
"type": "VEC2"
},
{
"bufferView": 7,
"componentType": 5125,
"count": 6,
"max": [
3
],
"min": [
0
],
"type": "SCALAR"
}
],
"meshes": [
{
"primitives": [
{
"mode": 4,
"attributes": {
"POSITION": 0,
"NORMAL": 1,
"TEXCOORD_0": 2
},
"extras": {
"parameters": {
"type": "TextGeometry",
"width": 300,
"height": 200,
"depth": 0,
"horizontalAlign": 1,
"verticalAlign": 1,
"fontSize": 69,
"lineHeight": 1.2,
"letterSpacing": 0,
"text": {
"textValue": "String value"
},
"textTransform": 2,
"font": "22f65959-ceca-4326-b642-e764de5a1a2d",
"editable": false,
"extrudeBevelSize": 0,
"extrudeBevelSegments": 1
},
"type": "TextGeometry"
},
"indices": 3
}
]
},
{
"primitives": [
{
"mode": 4,
"attributes": {
"POSITION": 4,
"NORMAL": 5,
"TEXCOORD_0": 6
},
"extras": {
"shape": {
"points": [
-500,
250,
-500,
250,
-500,
250,
0,
500,
250,
500,
250,
500,
250,
0,
500,
-250,
500,
-250,
500,
-250,
0,
-500,
-250,
-500,
-250,
-500,
-250,
0
],
"shapeHoles": [],
"isClosed": true,
"roundness": 0
},
"parameters": {
"width": 1000,
"depth": 0,
"cornerRadius": [
0,
0,
0,
0
],
"cornerType": 1,
"extrudeBevelSize": 0,
"extrudeBevelSegments": 1,
"height": 500,
"type": "RectangleGeometry"
},
"ui": {
"enabledIndieCorners": false
},
"type": "RectangleGeometry"
},
"indices": 7
}
]
}
],
"cameras": [
{
"type": "orthographic",
"orthographic": {
"xmag": 11.395488657638271,
"ymag": 6.345900429716551,
"zfar": 100000,
"znear": 0
}
}
]
}
File diff suppressed because it is too large. Load diff