Browse Source

Fix a bug in vert weight assignment

Panagiotis Christopoulos Charitos 7 years ago
parent
commit
c9f074e1ee

+ 1 - 1
samples/common/Framework.cpp

@@ -20,7 +20,7 @@ Error SampleApp::init(int argc, char** argv, CString sampleName)
 
 
 	// Init the super class
 	// Init the super class
 	Config config;
 	Config config;
-	config.set("window.fullscreenDesktopResolution", true);
+	config.set("window.fullscreen", true);
 	config.set("rsrc.dataPaths", ".:../..");
 	config.set("rsrc.dataPaths", ".:../..");
 	config.set("window.debugContext", 0);
 	config.set("window.debugContext", 0);
 	ANKI_CHECK(config.setFromCommandLineArguments(argc, argv));
 	ANKI_CHECK(config.setFromCommandLineArguments(argc, argv));

+ 1 - 1
src/anki/core/App.cpp

@@ -376,7 +376,7 @@ Error App::initInternal(const ConfigSet& config_, AllocAlignedCallback allocCb,
 	nwinit.m_height = config.getNumber("height");
 	nwinit.m_height = config.getNumber("height");
 	nwinit.m_depthBits = 0;
 	nwinit.m_depthBits = 0;
 	nwinit.m_stencilBits = 0;
 	nwinit.m_stencilBits = 0;
-	nwinit.m_fullscreenDesktopRez = config.getNumber("window.fullscreenDesktopResolution");
+	nwinit.m_fullscreenDesktopRez = config.getNumber("window.fullscreen");
 	m_window = m_heapAlloc.newInstance<NativeWindow>();
 	m_window = m_heapAlloc.newInstance<NativeWindow>();
 
 
 	ANKI_CHECK(m_window->init(nwinit, m_heapAlloc));
 	ANKI_CHECK(m_window->init(nwinit, m_heapAlloc));

+ 1 - 1
src/anki/core/Config.cpp

@@ -58,7 +58,7 @@ Config::Config()
 	newOption("rsrc.transferScratchMemorySize", 256_MB);
 	newOption("rsrc.transferScratchMemorySize", 256_MB);
 
 
 	// Window
 	// Window
-	newOption("window.fullscreenDesktopResolution", false);
+	newOption("window.fullscreen", false);
 	newOption("window.debugContext", false);
 	newOption("window.debugContext", false);
 	newOption("window.vsync", false);
 	newOption("window.vsync", false);
 	newOption("window.debugMarkers", false);
 	newOption("window.debugMarkers", false);

+ 3 - 5
src/anki/gr/vulkan/GrManagerImpl.cpp

@@ -404,12 +404,10 @@ Error GrManagerImpl::initInstance(const GrManagerInitInfo& init)
 	ANKI_VK_LOGI(
 	ANKI_VK_LOGI(
 		"GPU is %s. Vendor identified as %s", m_devProps.deviceName, &GPU_VENDOR_STR[m_capabilities.m_gpuVendor][0]);
 		"GPU is %s. Vendor identified as %s", m_devProps.deviceName, &GPU_VENDOR_STR[m_capabilities.m_gpuVendor][0]);
 
 
-	VkPhysicalDeviceFeatures devFeatures = m_devFeatures;
-	devFeatures.robustBufferAccess =
+	vkGetPhysicalDeviceFeatures(m_physicalDevice, &m_devFeatures);
+	m_devFeatures.robustBufferAccess =
 		(init.m_config->getNumber("window.debugContext") && m_devFeatures.robustBufferAccess) ? true : false;
 		(init.m_config->getNumber("window.debugContext") && m_devFeatures.robustBufferAccess) ? true : false;
-	ANKI_VK_LOGI("Robust buffer access is %s", (devFeatures.robustBufferAccess) ? "enabled" : "disabled");
-
-	vkGetPhysicalDeviceFeatures(m_physicalDevice, &devFeatures);
+	ANKI_VK_LOGI("Robust buffer access is %s", (m_devFeatures.robustBufferAccess) ? "enabled" : "disabled");
 
 
 	// Set limits
 	// Set limits
 	m_capabilities.m_uniformBufferBindOffsetAlignment =
 	m_capabilities.m_uniformBufferBindOffsetAlignment =

+ 1 - 1
src/anki/physics/PhysicsBody.cpp

@@ -38,7 +38,7 @@ PhysicsBody::PhysicsBody(PhysicsWorld* world, const PhysicsBodyInitInfo& init)
 
 
 	// Other
 	// Other
 	setMaterialGroup((dynamic) ? PhysicsMaterialBit::DYNAMIC_GEOMETRY : PhysicsMaterialBit::STATIC_GEOMETRY);
 	setMaterialGroup((dynamic) ? PhysicsMaterialBit::DYNAMIC_GEOMETRY : PhysicsMaterialBit::STATIC_GEOMETRY);
-	setMaterialMask(PhysicsMaterialBit::ALL);
+	setMaterialMask(PhysicsMaterialBit::ALL & (~PhysicsMaterialBit::STATIC_GEOMETRY));
 	setTransform(init.m_transform);
 	setTransform(init.m_transform);
 
 
 	// Add to world
 	// Add to world

+ 7 - 0
src/anki/physics/PhysicsWorld.cpp

@@ -59,6 +59,13 @@ public:
 			return false;
 			return false;
 		}
 		}
 
 
+		// Reject if they are both static
+		if(ANKI_UNLIKELY(fobj0->getMaterialGroup() == PhysicsMaterialBit::STATIC_GEOMETRY
+						 && fobj1->getMaterialGroup() == PhysicsMaterialBit::STATIC_GEOMETRY))
+		{
+			return false;
+		}
+
 		// Detailed tests using callbacks
 		// Detailed tests using callbacks
 		if(fobj0->getPhysicsBroadPhaseFilterCallback())
 		if(fobj0->getPhysicsBroadPhaseFilterCallback())
 		{
 		{

+ 45 - 52
src/anki/resource/ModelResource.cpp

@@ -14,6 +14,23 @@
 namespace anki
 namespace anki
 {
 {
 
 
+static Bool attributeIsRequired(VertexAttributeLocation loc, Pass pass, Bool hasSkin)
+{
+	if(pass == Pass::GB || pass == Pass::FS)
+	{
+		return true;
+	}
+	else if(!hasSkin)
+	{
+		return loc == VertexAttributeLocation::POSITION;
+	}
+	else
+	{
+		return loc == VertexAttributeLocation::POSITION || loc == VertexAttributeLocation::BONE_INDICES
+			   || loc == VertexAttributeLocation::BONE_WEIGHTS;
+	}
+}
+
 ModelPatch::ModelPatch(ModelResource* model)
 ModelPatch::ModelPatch(ModelResource* model)
 	: m_model(model)
 	: m_model(model)
 {
 {
@@ -26,6 +43,8 @@ ModelPatch::~ModelPatch()
 void ModelPatch::getRenderingDataSub(
 void ModelPatch::getRenderingDataSub(
 	const RenderingKey& key, WeakArray<U8> subMeshIndicesArray, ModelRenderingInfo& inf) const
 	const RenderingKey& key, WeakArray<U8> subMeshIndicesArray, ModelRenderingInfo& inf) const
 {
 {
+	const Bool hasSkin = m_model->getSkeleton().isCreated();
+
 	// Get the resources
 	// Get the resources
 	RenderingKey meshKey = key;
 	RenderingKey meshKey = key;
 	meshKey.m_lod = min<U>(key.m_lod, m_meshCount - 1);
 	meshKey.m_lod = min<U>(key.m_lod, m_meshCount - 1);
@@ -35,76 +54,50 @@ void ModelPatch::getRenderingDataSub(
 	{
 	{
 		RenderingKey mtlKey = key;
 		RenderingKey mtlKey = key;
 		mtlKey.m_lod = min<U>(key.m_lod, m_mtl->getLodCount() - 1);
 		mtlKey.m_lod = min<U>(key.m_lod, m_mtl->getLodCount() - 1);
-		mtlKey.m_skinned = m_model->getSkeleton().isCreated();
+		mtlKey.m_skinned = hasSkin;
 
 
 		const MaterialVariant& variant = m_mtl->getOrCreateVariant(mtlKey);
 		const MaterialVariant& variant = m_mtl->getOrCreateVariant(mtlKey);
 
 
 		inf.m_program = variant.getShaderProgram();
 		inf.m_program = variant.getShaderProgram();
 	}
 	}
 
 
-	// Vertex attributes
-	U32 positionBinding = MAX_U32;
+	// Vertex attributes & bindings
 	{
 	{
-		if(key.m_pass == Pass::GB || key.m_pass == Pass::FS)
-		{
-			// All attributes
+		U32 bufferBindingVisitedMask = 0;
+		Array<U32, MAX_VERTEX_ATTRIBUTES> realBufferBindingToVirtual;
 
 
-			inf.m_vertexAttributeCount = 0;
+		inf.m_vertexAttributeCount = 0;
+		inf.m_vertexBufferBindingCount = 0;
 
 
-			for(VertexAttributeLocation loc = VertexAttributeLocation::FIRST; loc < VertexAttributeLocation::COUNT;
-				++loc)
+		for(VertexAttributeLocation loc = VertexAttributeLocation::FIRST; loc < VertexAttributeLocation::COUNT; ++loc)
+		{
+			if(!mesh.isVertexAttributePresent(loc) || !attributeIsRequired(loc, key.m_pass, hasSkin))
 			{
 			{
-				if(!mesh.isVertexAttributePresent(loc))
-				{
-					continue;
-				}
-
-				VertexAttributeInfo& out = inf.m_vertexAttributes[inf.m_vertexAttributeCount++];
-
-				out.m_location = loc;
-				mesh.getVertexAttributeInfo(loc, out.m_bufferBinding, out.m_format, out.m_relativeOffset);
+				continue;
 			}
 			}
-		}
-		else
-		{
-			// Only position
-
-			inf.m_vertexAttributeCount = 1;
 
 
-			VertexAttributeInfo& out = inf.m_vertexAttributes[0];
-			out.m_location = VertexAttributeLocation::POSITION;
+			// Attribute
+			VertexAttributeInfo& attrib = inf.m_vertexAttributes[inf.m_vertexAttributeCount++];
+			attrib.m_location = loc;
+			mesh.getVertexAttributeInfo(loc, attrib.m_bufferBinding, attrib.m_format, attrib.m_relativeOffset);
 
 
-			mesh.getVertexAttributeInfo(out.m_location, out.m_bufferBinding, out.m_format, out.m_relativeOffset);
-
-			// Rewrite the binding just so we can keep it in a low binding location
-			positionBinding = out.m_bufferBinding;
-			out.m_bufferBinding = 0;
-		}
-	}
-
-	// Vertex buffers
-	{
-		if(key.m_pass == Pass::GB || key.m_pass == Pass::FS)
-		{
-			// All attributes
+			// Binding. Also, remove any holes in the bindings
+			if(!(bufferBindingVisitedMask & (1 << attrib.m_bufferBinding)))
+			{
+				bufferBindingVisitedMask |= 1 << attrib.m_bufferBinding;
 
 
-			inf.m_vertexBufferBindingCount = mesh.getVertexBufferCount();
+				VertexBufferBinding& binding = inf.m_vertexBufferBindings[inf.m_vertexBufferBindingCount];
+				mesh.getVertexBufferInfo(attrib.m_bufferBinding, binding.m_buffer, binding.m_offset, binding.m_stride);
 
 
-			for(U i = 0; i < inf.m_vertexBufferBindingCount; ++i)
-			{
-				VertexBufferBinding& out = inf.m_vertexBufferBindings[i];
-				mesh.getVertexBufferInfo(i, out.m_buffer, out.m_offset, out.m_stride);
+				realBufferBindingToVirtual[attrib.m_bufferBinding] = inf.m_vertexBufferBindingCount;
+				++inf.m_vertexBufferBindingCount;
 			}
 			}
-		}
-		else
-		{
-			// Only position
-
-			inf.m_vertexBufferBindingCount = 1;
 
 
-			VertexBufferBinding& out = inf.m_vertexBufferBindings[0];
-			mesh.getVertexBufferInfo(positionBinding, out.m_buffer, out.m_offset, out.m_stride);
+			// Change the binding of the attrib
+			attrib.m_bufferBinding = realBufferBindingToVirtual[attrib.m_bufferBinding];
 		}
 		}
+
+		ANKI_ASSERT(inf.m_vertexAttributeCount != 0 && inf.m_vertexBufferBindingCount != 0);
 	}
 	}
 
 
 	// Index buff
 	// Index buff