76 lines
2.3 KiB
JavaScript
76 lines
2.3 KiB
JavaScript
"use strict";
|
|
|
|
const RoomMaterialDebug = (function(){
|
|
|
|
const RoomMaterialDebug = function(hollow_bond){
|
|
|
|
const face_cache = {},
|
|
edge_cache = {};
|
|
|
|
/**
|
|
* Material de las caras translúcidas de la habitación según la distancia al piso enfocado.
|
|
* @param {number} [dist=0] - Distancia en pisos |floor - current_floor|
|
|
* @returns {THREE.MeshBasicMaterial}
|
|
*/
|
|
this.get_face_material = (dist = 0) => {
|
|
const key = String(dist);
|
|
|
|
if(!face_cache[key]){
|
|
// Piso activo: opacidad moderada; pisos lejanos: decaimiento progresivo
|
|
const opacity = dist === 0 ? 0.35 : Math.max(0.06, 0.22 / (dist * 1.5));
|
|
|
|
face_cache[key] = new THREE.MeshBasicMaterial({
|
|
color : 0x9333ea, // Púrpura característico de habitaciones
|
|
transparent : true,
|
|
opacity : opacity,
|
|
depthWrite : false
|
|
});
|
|
}
|
|
|
|
return face_cache[key];
|
|
};
|
|
|
|
/**
|
|
* Material para perfilar las aristas ortogonales de la habitación.
|
|
* @param {number} [dist=0]
|
|
* @returns {THREE.LineBasicMaterial}
|
|
*/
|
|
this.get_edge_material = (dist = 0) => {
|
|
const key = String(dist);
|
|
|
|
if(!edge_cache[key]){
|
|
const opacity = dist === 0 ? 0.85 : Math.max(0.12, 0.5 / (dist * 1.4));
|
|
|
|
edge_cache[key] = new THREE.LineBasicMaterial({
|
|
color : 0xd8b4fe, // Lavanda brillante para aristas
|
|
transparent : true,
|
|
opacity : opacity,
|
|
depthWrite : false
|
|
});
|
|
}
|
|
|
|
return edge_cache[key];
|
|
};
|
|
|
|
// Fallback rápido compatible
|
|
this.get = () => this.get_face_material(0);
|
|
|
|
this.reset = () => {
|
|
for(const k in face_cache){
|
|
if(face_cache[k]){
|
|
face_cache[k].dispose();
|
|
delete face_cache[k];
|
|
}
|
|
}
|
|
for(const k in edge_cache){
|
|
if(edge_cache[k]){
|
|
edge_cache[k].dispose();
|
|
delete edge_cache[k];
|
|
}
|
|
}
|
|
};
|
|
|
|
};
|
|
|
|
return RoomMaterialDebug;
|
|
})(); |