Add backwards-compatible behaviour if too few CAO textures specified
(#11766)
This commit is contained in:
		
							parent
							
								
									52bfbf6ed0
								
							
						
					
					
						commit
						206e131854
					
				@ -7184,6 +7184,7 @@ Player properties need to be saved manually.
 | 
			
		||||
        -- "sprite" uses 1 texture.
 | 
			
		||||
        -- "upright_sprite" uses 2 textures: {front, back}.
 | 
			
		||||
        -- "wielditem" expects 'textures = {itemname}' (see 'visual' above).
 | 
			
		||||
        -- "mesh" requires one texture for each mesh buffer/material (in order)
 | 
			
		||||
 | 
			
		||||
        colors = {},
 | 
			
		||||
        -- Number of required colors depends on visual
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
#include "client/sound.h"
 | 
			
		||||
#include "client/tile.h"
 | 
			
		||||
#include "util/basic_macros.h"
 | 
			
		||||
#include "util/numeric.h" // For IntervalLimiter & setPitchYawRoll
 | 
			
		||||
#include "util/numeric.h"
 | 
			
		||||
#include "util/serialize.h"
 | 
			
		||||
#include "camera.h" // CameraModes
 | 
			
		||||
#include "collision.h"
 | 
			
		||||
@ -171,6 +171,20 @@ static void updatePositionRecursive(scene::ISceneNode *node)
 | 
			
		||||
	node->updateAbsolutePosition();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool logOnce(const std::ostringstream &from, std::ostream &log_to)
 | 
			
		||||
{
 | 
			
		||||
	thread_local std::vector<u64> logged;
 | 
			
		||||
 | 
			
		||||
	std::string message = from.str();
 | 
			
		||||
	u64 hash = murmur_hash_64_ua(message.data(), message.length(), 0xBADBABE);
 | 
			
		||||
 | 
			
		||||
	if (std::find(logged.begin(), logged.end(), hash) != logged.end())
 | 
			
		||||
		return false;
 | 
			
		||||
	logged.push_back(hash);
 | 
			
		||||
	log_to << message << std::endl;
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
	TestCAO
 | 
			
		||||
*/
 | 
			
		||||
@ -822,6 +836,28 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr)
 | 
			
		||||
	updateAttachments();
 | 
			
		||||
	setNodeLight(m_last_light);
 | 
			
		||||
	updateMeshCulling();
 | 
			
		||||
 | 
			
		||||
	if (m_animated_meshnode) {
 | 
			
		||||
		u32 mat_count = m_animated_meshnode->getMaterialCount();
 | 
			
		||||
		if (mat_count == 0 || m_prop.textures.empty()) {
 | 
			
		||||
			// nothing
 | 
			
		||||
		} else if (mat_count > m_prop.textures.size()) {
 | 
			
		||||
			std::ostringstream oss;
 | 
			
		||||
			oss << "GenericCAO::addToScene(): Model "
 | 
			
		||||
				<< m_prop.mesh << " loaded with " << mat_count
 | 
			
		||||
				<< " mesh buffers but only " << m_prop.textures.size()
 | 
			
		||||
				<< " texture(s) specifed, this is deprecated.";
 | 
			
		||||
			logOnce(oss, warningstream);
 | 
			
		||||
 | 
			
		||||
			video::ITexture *last = m_animated_meshnode->getMaterial(0).TextureLayer[0].Texture;
 | 
			
		||||
			for (s32 i = 1; i < mat_count; i++) {
 | 
			
		||||
				auto &layer = m_animated_meshnode->getMaterial(i).TextureLayer[0];
 | 
			
		||||
				if (!layer.Texture)
 | 
			
		||||
					layer.Texture = last;
 | 
			
		||||
				last = layer.Texture;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GenericCAO::updateLight(u32 day_night_ratio)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user