allow videotexture in puzzles
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import { Color, Group, DoubleSide, RepeatWrapping, MeshStandardMaterial } from "three"
|
import { Color, Group, DoubleSide, RepeatWrapping, MeshStandardMaterial, VideoTexture } from "three"
|
||||||
import { EventManager } from '@/lib/EventManager';
|
import { EventManager } from '@/lib/EventManager';
|
||||||
import { centerOrigin } from "@/lib/MeshUtils";
|
import { centerOrigin } from "@/lib/MeshUtils";
|
||||||
|
|
||||||
@@ -10,7 +10,21 @@ class ClassicPuzzle extends EventManager {
|
|||||||
const that = this;
|
const that = this;
|
||||||
return new Promise(async (resolve, reject)=>{
|
return new Promise(async (resolve, reject)=>{
|
||||||
let gltf = await engine.load(`puzzle-${data.dimension}.glb`, '/static/meshes/classic-puzzle/');
|
let gltf = await engine.load(`puzzle-${data.dimension}.glb`, '/static/meshes/classic-puzzle/');
|
||||||
let map = await engine.loadTexture(data.$go.asset.name);
|
let map, vi;
|
||||||
|
if (data.$go.type == 'video'){
|
||||||
|
await new Promise((resolve, reject)=>{
|
||||||
|
vi = document.createElement('video');
|
||||||
|
vi.src = engine.assetPath + data.$go.asset.name;
|
||||||
|
vi.muted = true;
|
||||||
|
vi.addEventListener('loadedmetadata', async ()=>{
|
||||||
|
map = new VideoTexture( vi );
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
map = await engine.loadTexture(data.$go.asset.name);
|
||||||
|
}
|
||||||
|
|
||||||
map.wrapS = RepeatWrapping;
|
map.wrapS = RepeatWrapping;
|
||||||
map.wrapT = RepeatWrapping;
|
map.wrapT = RepeatWrapping;
|
||||||
map.flipY = false;
|
map.flipY = false;
|
||||||
@@ -21,6 +35,7 @@ class ClassicPuzzle extends EventManager {
|
|||||||
let eventsFn= {
|
let eventsFn= {
|
||||||
start(){
|
start(){
|
||||||
that.dispatchEvent({type:'interaction'});
|
that.dispatchEvent({type:'interaction'});
|
||||||
|
if (vi?.paused) vi.play();
|
||||||
},
|
},
|
||||||
drag(){},
|
drag(){},
|
||||||
end(e){
|
end(e){
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<v-img :src="`/asset/thumb/${modelValue.go}.webp`" />
|
<v-img :src="`/asset/thumb/${modelValue.go}.webp`" />
|
||||||
<div class="text-caption text-center">{{ modelValue.title }}</div>
|
<div class="text-caption text-center">{{ modelValue.title }}</div>
|
||||||
</div>
|
</div>
|
||||||
<asset-selector @select="assignTexture" :type="['Texture']">
|
<asset-selector @select="assignTexture" :type="['Texture', 'Video']">
|
||||||
<template v-slot:activator="props">
|
<template v-slot:activator="props">
|
||||||
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>{{ l.chooseImage }}</v-btn>
|
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>{{ l.chooseImage }}</v-btn>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { BoxGeometry, Mesh, MeshStandardMaterial, Group } from 'three';
|
import { BoxGeometry, Mesh, MeshBasicMaterial, Group, VideoTexture } from 'three';
|
||||||
import { centerOrigin } from '@/lib/MeshUtils';
|
import { centerOrigin } from '@/lib/MeshUtils';
|
||||||
import { EventManager } from '@/lib/EventManager';
|
import { EventManager } from '@/lib/EventManager';
|
||||||
|
|
||||||
@@ -15,8 +15,23 @@ class PuzzleGame1 extends EventManager {
|
|||||||
|
|
||||||
let bm = new BoxGeometry(1, 1, 1);
|
let bm = new BoxGeometry(1, 1, 1);
|
||||||
|
|
||||||
let material = new MeshStandardMaterial({
|
let map, vi;
|
||||||
map: await engine.loadTexture(data.$go.asset.name),
|
if (data.$go.type == 'video'){
|
||||||
|
await new Promise((resolve, reject)=>{
|
||||||
|
vi = document.createElement('video');
|
||||||
|
vi.src = engine.assetPath + data.$go.asset.name;
|
||||||
|
vi.muted = true;
|
||||||
|
vi.addEventListener('loadedmetadata', async ()=>{
|
||||||
|
map = new VideoTexture( vi );
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
map = await engine.loadTexture(data.$go.asset.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
let material = new MeshBasicMaterial({
|
||||||
|
map,
|
||||||
// roughness:1, metalness:0,
|
// roughness:1, metalness:0,
|
||||||
// normalMap: await engine.loadTexture('NormalMap.png', '/static/textures/'),
|
// normalMap: await engine.loadTexture('NormalMap.png', '/static/textures/'),
|
||||||
});
|
});
|
||||||
@@ -72,6 +87,7 @@ class PuzzleGame1 extends EventManager {
|
|||||||
|
|
||||||
let clickFn = (i) => {
|
let clickFn = (i) => {
|
||||||
this.dispatchEvent({type:'interaction'});
|
this.dispatchEvent({type:'interaction'});
|
||||||
|
if (vi?.paused) vi.play();
|
||||||
if (!this.done && !aq.isActive(i.object)) {
|
if (!this.done && !aq.isActive(i.object)) {
|
||||||
i.object._ri = (i.object._ri + 1) % 6;
|
i.object._ri = (i.object._ri + 1) % 6;
|
||||||
aq.add({
|
aq.add({
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<v-img :src="`/asset/thumb/${modelValue.go}.webp`" />
|
<v-img :src="`/asset/thumb/${modelValue.go}.webp`" />
|
||||||
<div class="text-caption text-center">{{ modelValue.title }}</div>
|
<div class="text-caption text-center">{{ modelValue.title }}</div>
|
||||||
</div>
|
</div>
|
||||||
<asset-selector @select="assignTexture" :type="['Texture']">
|
<asset-selector @select="assignTexture" :type="['Texture', 'Video']">
|
||||||
<template v-slot:activator="props">
|
<template v-slot:activator="props">
|
||||||
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>{{ l.chooseImage }}</v-btn>
|
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>{{ l.chooseImage }}</v-btn>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { BoxGeometry, Mesh, MeshBasicMaterial, Group } from 'three';
|
import { BoxGeometry, Mesh, MeshBasicMaterial, Group, VideoTexture } from 'three';
|
||||||
import { centerOrigin } from '@/lib/MeshUtils';
|
import { centerOrigin } from '@/lib/MeshUtils';
|
||||||
import { EventManager } from '@/lib/EventManager';
|
import { EventManager } from '@/lib/EventManager';
|
||||||
|
|
||||||
@@ -8,13 +8,26 @@ class PuzzleGame2 extends EventManager {
|
|||||||
super();
|
super();
|
||||||
return new Promise(async (resolve, reject)=>{
|
return new Promise(async (resolve, reject)=>{
|
||||||
let w = data.w, h = data.h, wh = w*h;
|
let w = data.w, h = data.h, wh = w*h;
|
||||||
const texture = await engine.loadTexture(data.$go.asset.name);
|
let map, vi;
|
||||||
|
if (data.$go.type == 'video'){
|
||||||
|
await new Promise((resolve, reject)=>{
|
||||||
|
vi = document.createElement('video');
|
||||||
|
vi.src = engine.assetPath + data.$go.asset.name;
|
||||||
|
vi.muted = true;
|
||||||
|
vi.addEventListener('loadedmetadata', async ()=>{
|
||||||
|
map = new VideoTexture( vi );
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
map = await engine.loadTexture(data.$go.asset.name);
|
||||||
|
}
|
||||||
const material = new MeshBasicMaterial({
|
const material = new MeshBasicMaterial({
|
||||||
map: texture
|
map
|
||||||
});
|
});
|
||||||
const aq = engine.motionQueue;
|
const aq = engine.motionQueue;
|
||||||
const m2 = new MeshBasicMaterial({
|
const m2 = new MeshBasicMaterial({
|
||||||
map: texture,
|
map,
|
||||||
transparent: true,
|
transparent: true,
|
||||||
opacity: 0.37
|
opacity: 0.37
|
||||||
});
|
});
|
||||||
@@ -104,6 +117,7 @@ class PuzzleGame2 extends EventManager {
|
|||||||
|
|
||||||
let clickFn = (i) => {
|
let clickFn = (i) => {
|
||||||
this.dispatchEvent({type:'interaction'});
|
this.dispatchEvent({type:'interaction'});
|
||||||
|
if (vi?.paused) vi.play();
|
||||||
if (!this.done && !aq.isActive(i.object)) {
|
if (!this.done && !aq.isActive(i.object)) {
|
||||||
let idx = container.children.indexOf(i.object);
|
let idx = container.children.indexOf(i.object);
|
||||||
if (idx == lidx) return; //we ignore the empty cell
|
if (idx == lidx) return; //we ignore the empty cell
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<v-img :src="`/asset/thumb/${modelValue.go}.webp`" />
|
<v-img :src="`/asset/thumb/${modelValue.go}.webp`" />
|
||||||
<div class="text-caption text-center">{{ modelValue.title }}</div>
|
<div class="text-caption text-center">{{ modelValue.title }}</div>
|
||||||
</div>
|
</div>
|
||||||
<asset-selector @select="assignTexture" :type="['Texture']">
|
<asset-selector @select="assignTexture" :type="['Texture', 'Video']">
|
||||||
<template v-slot:activator="props">
|
<template v-slot:activator="props">
|
||||||
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>{{ l.chooseImage }}</v-btn>
|
<v-btn v-bind="props" prepend-icon="mdi-video-box" color="deep-orange-darken-4" block>{{ l.chooseImage }}</v-btn>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
Reference in New Issue
Block a user