diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llmath/llvolume.cpp | 28 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl | 3 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolalpha.cpp | 39 | ||||
| -rw-r--r-- | indra/newview/llface.cpp | 31 | ||||
| -rw-r--r-- | indra/newview/llfloatermodelpreview.cpp | 162 | ||||
| -rw-r--r-- | indra/newview/llmanipscale.cpp | 1 | ||||
| -rwxr-xr-x[-rw-r--r--] | indra/newview/llmeshrepository.cpp | 65 | ||||
| -rw-r--r-- | indra/newview/llviewerregion.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 15 | 
9 files changed, 212 insertions, 133 deletions
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 618b056768..8c81f27784 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -2642,14 +2642,20 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)  			LLVector4a& min = face.mExtents[0];  			LLVector4a& max = face.mExtents[1]; -			min.clear(); -			max.clear(); -			min = max = face.mPositions[0]; - -			for (S32 i = 1; i < face.mNumVertices; ++i) +			if (face.mNumVertices < 3) +			{ //empty face, use a dummy 1cm (at 1m scale) bounding box +				min.splat(-0.005f); +				max.splat(0.005f); +			} +			else  			{ -				min.setMin(min, face.mPositions[i]); -				max.setMax(max, face.mPositions[i]); +				min = max = face.mPositions[0]; + +				for (S32 i = 1; i < face.mNumVertices; ++i) +				{ +					min.setMin(min, face.mPositions[i]); +					max.setMax(max, face.mPositions[i]); +				}  			}  		}  	} @@ -3245,7 +3251,11 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components,  		// don't test lowest LOD to support legacy content DEV-33670  		if (mDetail > SCULPT_MIN_AREA_DETAIL)  		{ -			if (sculptGetSurfaceArea() < SCULPT_MIN_AREA) +			F32 area = sculptGetSurfaceArea(); + +			const F32 SCULPT_MAX_AREA = 32.f; + +			if (area < SCULPT_MIN_AREA || area > SCULPT_MAX_AREA)  			{  				data_is_empty = TRUE;  			} @@ -5502,6 +5512,8 @@ LLVolumeFace::LLVolumeFace() :  	mOctree(NULL)  {  	mExtents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*3); +	mExtents[0].splat(-0.5f); +	mExtents[1].splat(0.5f);  	mCenter = mExtents+2;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl index 5e6c5ebec8..d781e08548 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl @@ -23,7 +23,6 @@ void main()  	color.rgb = fullbrightScaleSoftClip(color.rgb); -	//gl_FragColor = color; -	gl_FragColor = vec4(1,0,1,1); +	gl_FragColor = color;  } diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 71eee0188c..8d46133912 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -125,6 +125,9 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)  	{  		simple_shader = &gDeferredAlphaProgram;  		fullbright_shader = &gObjectFullbrightProgram; + +		//prime simple shader (loads shadow relevant uniforms) +		gPipeline.bindDeferredShader(*simple_shader);  	}  	else  	{ @@ -290,11 +293,6 @@ void LLDrawPoolAlpha::render(S32 pass)  		gGL.setSceneBlendType(LLRender::BT_ALPHA);  	} -	if (deferred_render && current_shader != NULL) -	{ -		gPipeline.unbindDeferredShader(*current_shader); -	} -  	if (sShowDebugAlpha)  	{  		if(gPipeline.canUseWindLightShaders())  @@ -346,8 +344,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)  {  	BOOL initialized_lighting = FALSE;  	BOOL light_enabled = TRUE; -	S32 diffuse_channel = 0; - +	  	BOOL use_shaders = gPipeline.canUseVertexShaders();  	for (LLCullResult::sg_list_t::iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i) @@ -411,29 +408,11 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)  				if(use_shaders && (current_shader != target_shader))  				{  					llassert(target_shader != NULL); -					if (deferred_render && current_shader != NULL) -					{ -						gPipeline.unbindDeferredShader(*current_shader); -						diffuse_channel = 0; -					}  					current_shader = target_shader; -					if (deferred_render) -					{ -						gPipeline.bindDeferredShader(*current_shader); -						diffuse_channel = current_shader->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); -					} -					else -					{ -						current_shader->bind(); -					} +					current_shader->bind();  				}  				else if (!use_shaders && current_shader != NULL)  				{ -					if (deferred_render) -					{ -						gPipeline.unbindDeferredShader(*current_shader); -						diffuse_channel = 0; -					}  					LLGLSLShader::bindNoShader();  					current_shader = NULL;  				} @@ -510,12 +489,8 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)  		}  	} -	if (deferred_render && current_shader != NULL) -	{ -		gPipeline.unbindDeferredShader(*current_shader); -		LLVertexBuffer::unbind();	 -	} -	 +	LLVertexBuffer::unbind();	 +		  	if (!light_enabled)  	{  		gPipeline.enableLightsDynamic(); diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 540ed054e9..b6566fcbd0 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -693,6 +693,19 @@ static void xform(LLVector2 &tex_coord, F32 cosAng, F32 sinAng, F32 offS, F32 of  } +bool less_than_max_mag(const LLVector4a& vec) +{ +	LLVector4a MAX_MAG; +	MAX_MAG.splat(1024.f*1024.f); + +	LLVector4a val; +	val.setAbs(vec); + +	S32 lt = val.lessThan(MAX_MAG).getGatheredBits() & 0x7; +	 +	return lt == 0x7; +} +  BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,  								const LLMatrix4& mat_vert_in, const LLMatrix3& mat_normal_in, BOOL global_volume)  { @@ -727,6 +740,8 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,  		min = face.mExtents[0];  		max = face.mExtents[1]; +		llassert(less_than_max_mag(min)); +		llassert(less_than_max_mag(max));  		//min, max are in volume space, convert to drawable render space  		LLVector4a center; @@ -738,6 +753,9 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,  		size.setSub(max, min);  		size.mul(0.5f); +		llassert(less_than_max_mag(min)); +		llassert(less_than_max_mag(max)); +  		if (!global_volume)  		{  			//VECTORIZE THIS @@ -775,6 +793,8 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,  		newMin = newMax = center; +		llassert(less_than_max_mag(center)); +		  		for (U32 i = 0; i < 4; i++)  		{  			LLVector4a delta; @@ -786,6 +806,9 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,  			newMin.setMin(newMin,min);  			newMax.setMax(newMax,max); + +			llassert(less_than_max_mag(newMin)); +			llassert(less_than_max_mag(newMax));  		}  		if (!mDrawablep->isActive()) @@ -794,14 +817,22 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,  			offset.load3(mDrawablep->getRegion()->getOriginAgent().mV);  			newMin.add(offset);  			newMax.add(offset); +			 +			llassert(less_than_max_mag(newMin)); +			llassert(less_than_max_mag(newMax));  		}  		t.setAdd(newMin, newMax);  		t.mul(0.5f); +		llassert(less_than_max_mag(t)); +		  		//VECTORIZE THIS  		mCenterLocal.set(t.getF32ptr()); +		llassert(less_than_max_mag(newMin)); +		llassert(less_than_max_mag(newMax)); +  		t.setSub(newMax,newMin);  		mBoundingSphereRadius = t.getLength3().getF32()*0.5f; diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 92ec714c80..409d8bc79a 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -1289,11 +1289,7 @@ void stretch_extents(LLModel* model, LLMatrix4& mat, LLVector3& min, LLVector3&  void LLModelLoader::run()  { -	if (!doLoadModel()) -	{ -		mPreview = NULL; -	} - +	doLoadModel();  	doOnIdleOneTime(boost::bind(&LLModelLoader::loadModelCallback,this));  } @@ -2305,87 +2301,87 @@ bool LLModelLoader::isNodeAJoint( domNode* pNode )  //-----------------------------------------------------------------------------  // verifyCount  //----------------------------------------------------------------------------- -bool LLModelPreview::verifyCount( int expected, int result )
 -{
 -	if ( expected != result )
 -	{
 -		llinfos<< "Error: (expected/got)"<<expected<<"/"<<result<<"verts"<<llendl;
 -		return false;
 -	}
 -	return true;
 -}
 +bool LLModelPreview::verifyCount( int expected, int result ) +{ +	if ( expected != result ) +	{ +		llinfos<< "Error: (expected/got)"<<expected<<"/"<<result<<"verts"<<llendl; +		return false; +	} +	return true; +}  //-----------------------------------------------------------------------------  // verifyController  //----------------------------------------------------------------------------- -bool LLModelPreview::verifyController( domController* pController )
 -{	
 -
 -	bool result = true;
 -
 -	domSkin* pSkin = pController->getSkin();
 -
 -	if ( pSkin )
 -	{
 -		xsAnyURI & uri = pSkin->getSource();
 -		domElement* pElement = uri.getElement();
 -
 -		if ( !pElement )
 -		{
 -			llinfos<<"Can't resolve skin source"<<llendl;
 -			return false;
 -		}
 -
 -		daeString type_str = pElement->getTypeName();
 -		if ( stricmp(type_str, "geometry") == 0 )
 -		{	
 -			//Skin is reference directly by geometry and get the vertex count from skin
 -			domSkin::domVertex_weights* pVertexWeights = pSkin->getVertex_weights();
 -			U32 vertexWeightsCount = pVertexWeights->getCount();
 -			domGeometry* pGeometry = (domGeometry*) (domElement*) uri.getElement();
 -			domMesh* pMesh = pGeometry->getMesh();				
 -			
 -			if ( pMesh )
 -			{
 -				//Get vertex count from geometry
 -				domVertices* pVertices = pMesh->getVertices();
 -				if ( !pVertices )
 -				{ 
 -					llinfos<<"No vertices!"<<llendl;
 -					return false;
 -				}
 -
 -				if ( pVertices )
 -				{
 -					xsAnyURI src = pVertices->getInput_array()[0]->getSource();
 -					domSource* pSource = (domSource*) (domElement*) src.getElement();
 -					U32 verticesCount = pSource->getTechnique_common()->getAccessor()->getCount();
 -					result = verifyCount( verticesCount, vertexWeightsCount );
 -					if ( !result )
 -					{
 -						return result;
 -					}
 -				}
 -			}	
 -
 -			U32 vcountCount = (U32) pVertexWeights->getVcount()->getValue().getCount();
 -			result = verifyCount( vcountCount, vertexWeightsCount );	
 -			if ( !result )
 -			{
 -				return result;
 -			}
 -
 -			domInputLocalOffset_Array& inputs = pVertexWeights->getInput_array();
 -			U32 sum = 0;
 -			for (size_t i=0; i<vcountCount; i++)
 -			{
 -				sum += pVertexWeights->getVcount()->getValue()[i];
 -			}
 -			result = verifyCount( sum * inputs.getCount(), (domInt) pVertexWeights->getV()->getValue().getCount() );
 -		}
 -	}
 -	
 -	return result;
 -}
 +bool LLModelPreview::verifyController( domController* pController ) +{	 + +	bool result = true; + +	domSkin* pSkin = pController->getSkin(); + +	if ( pSkin ) +	{ +		xsAnyURI & uri = pSkin->getSource(); +		domElement* pElement = uri.getElement(); + +		if ( !pElement ) +		{ +			llinfos<<"Can't resolve skin source"<<llendl; +			return false; +		} + +		daeString type_str = pElement->getTypeName(); +		if ( stricmp(type_str, "geometry") == 0 ) +		{	 +			//Skin is reference directly by geometry and get the vertex count from skin +			domSkin::domVertex_weights* pVertexWeights = pSkin->getVertex_weights(); +			U32 vertexWeightsCount = pVertexWeights->getCount(); +			domGeometry* pGeometry = (domGeometry*) (domElement*) uri.getElement(); +			domMesh* pMesh = pGeometry->getMesh();				 +			 +			if ( pMesh ) +			{ +				//Get vertex count from geometry +				domVertices* pVertices = pMesh->getVertices(); +				if ( !pVertices ) +				{  +					llinfos<<"No vertices!"<<llendl; +					return false; +				} + +				if ( pVertices ) +				{ +					xsAnyURI src = pVertices->getInput_array()[0]->getSource(); +					domSource* pSource = (domSource*) (domElement*) src.getElement(); +					U32 verticesCount = pSource->getTechnique_common()->getAccessor()->getCount(); +					result = verifyCount( verticesCount, vertexWeightsCount ); +					if ( !result ) +					{ +						return result; +					} +				} +			}	 + +			U32 vcountCount = (U32) pVertexWeights->getVcount()->getValue().getCount(); +			result = verifyCount( vcountCount, vertexWeightsCount );	 +			if ( !result ) +			{ +				return result; +			} + +			domInputLocalOffset_Array& inputs = pVertexWeights->getInput_array(); +			U32 sum = 0; +			for (size_t i=0; i<vcountCount; i++) +			{ +				sum += pVertexWeights->getVcount()->getValue()[i]; +			} +			result = verifyCount( sum * inputs.getCount(), (domInt) pVertexWeights->getV()->getValue().getCount() ); +		} +	} +	 +	return result; +}  //-----------------------------------------------------------------------------  // extractTranslation() diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index 0eedabb5de..4eb94dfb8e 100644 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -92,7 +92,6 @@ F32 get_default_max_prim_scale(bool is_flora)  	// a bit of a hack, but if it's foilage, we don't want to use the  	// new larger scale which would result in giant trees and grass  	if (gMeshRepo.meshRezEnabled() && -		!gAgent.getRegion()->getCapability("ObjectAdd").empty() &&  		!is_flora)  	{  		return DEFAULT_MAX_PRIM_SCALE; diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 8e5d132096..111802cd47 100644..100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -468,6 +468,49 @@ public:  }; +void log_upload_error(const LLSD& content,std::string stage) +{ +	if (content.has("error")) +	{ +		const LLSD& err = content["error"]; +		llwarns << "mesh upload failed, stage " << stage +				<< " message " << err["message"].asString() << " id " << err["identifier"].asString() +				<< llendl; + +		if (content.has("errors")) +		{ +			const LLSD& err_list = content["errors"]; +			for (LLSD::array_const_iterator it = err_list.beginArray(); +				 it != err_list.endArray(); +				 ++it) +			{ +				const LLSD& err_entry = *it; +				std::string index_info; +				std::string texture_index_str = err_entry["TextureIndex"].asString(); +				if (!texture_index_str.empty()) +				{ +					index_info += " texture_index: " + texture_index_str; +				} +				std::string	mesh_index_str = err_entry["MeshIndex"].asString(); +				if (!mesh_index_str.empty()) +				{ +					index_info += " mesh_index: " + mesh_index_str; +				} +				llwarns << "mesh err code " << err_entry["error"].asString() +						<< " message " << err_entry["message"] +						<< index_info +						<< llendl; +			} +		} +	} +	else +	{ +		llwarns << "bad mesh, no error information available" << llendl; +	} + +	 +} +  class LLModelObjectUploadResponder: public LLCurl::Responder  {  	LLSD mObjectAsset; @@ -511,15 +554,17 @@ public:  		llinfos << "LLWholeModelFeeResponder content: " << content << llendl;  		if (isGoodStatus(status))  		{ +			llinfos << "fee request succeeded" << llendl;  			mThread->mWholeModelUploadURL = content["uploader"].asString();   		}  		else  		{ -			llinfos << "upload failed" << llendl; +			llwarns << "fee request failed" << llendl; +			log_upload_error(content,"fee");  			mThread->mWholeModelUploadURL = "";  		} -  	} +  };  class LLWholeModelUploadResponder: public LLCurl::Responder @@ -538,13 +583,21 @@ public:  						   const LLSD& content)  	{  		//assert_main_thread(); -		llinfos << "upload completed" << llendl;  		mThread->mPendingUploads--;  		dumpLLSDToFile(content,make_dump_name("whole_model_upload_response_",dump_num));  		// requested "mesh" asset type isn't actually the type  		// of the resultant object, fix it up here. -		mPostData["asset_type"] = "object"; -		gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mPostData,content)); +		if (isGoodStatus(status)) +		{ +			llinfos << "upload succeeded" << llendl; +			mPostData["asset_type"] = "object"; +			gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mPostData,content)); +		} +		else +		{ +			llwarns << "upload failed" << llendl; +			log_upload_error(content,"upload"); +		}  	}  }; @@ -1533,7 +1586,7 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)  					face_entry["offsett"] = 0.0;  					face_entry["imagerot"] = 0.0;  				} -				face_entry["colors"] = ll_sd_from_color4(material.mDiffuseColor); +				face_entry["diffuse_color"] = ll_sd_from_color4(material.mDiffuseColor);  				face_entry["fullbright"] = material.mFullbright;  				instance_entry["face_list"][face_num] = face_entry;  		    } diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index f3fb4b82ad..002e0567e4 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1526,7 +1526,6 @@ void LLViewerRegion::setSeedCapability(const std::string& url)  	capabilityNames.append("MapLayer");  	capabilityNames.append("MapLayerGod");  	capabilityNames.append("NewFileAgentInventory"); -	capabilityNames.append("ObjectAdd");  	capabilityNames.append("ParcelPropertiesUpdate");  	capabilityNames.append("ParcelMediaURLFilterList");  	capabilityNames.append("ParcelNavigateMedia"); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 1489c033e2..4d678117a5 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -773,14 +773,29 @@ void LLPipeline::updateRenderDeferred()  //static  void LLPipeline::refreshRenderDeferred()  { +	static BOOL physics_shapes_is_on = FALSE ; +	static BOOL render_glow_copy = FALSE ; +  	if(gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))  	{ +		if(!physics_shapes_is_on) +		{ +			physics_shapes_is_on = TRUE ; +			render_glow_copy = sRenderGlow ; +		} +  		//turn the deferred rendering and glow off when draw physics shapes.  		sRenderDeferred = FALSE ;  		sRenderGlow = FALSE ;  	}  	else  	{ +		if(physics_shapes_is_on) +		{ +			physics_shapes_is_on = FALSE ; +			sRenderGlow = render_glow_copy ; +		} +  		updateRenderDeferred() ;  	}  }  | 
