示例#1
0
		void Jacobian(const gsl_vector *X, gsl_matrix *J) const
		{
			std::vector<real_t> vX(m_arity);
			std::vector<real_t> vR(m_arity), vJ(m_arity*m_arity);
			m_f.roots_and_jacobian(&vX[0], &vR[0], &vJ[0]);
			ToGSL(J, vJ);
		}
示例#2
0
		void Roots(const gsl_vector *X,  gsl_vector *R) const
		{
			std::vector<real_t> vX(FromGSL<real_t>(X));
			std::vector<real_t> vR(m_arity);
			m_f.roots(&vX[0], &vR[0]);
			ToGSL(R, vR);
		}
示例#3
0
void House::CreateStep(std::vector<Vertex*>& vect, double base, double height)
{
	assert(base != height);
	
	std::vector<Vertex*> ceiling;
	
	for (int i = 0; i < 4; i++)
	{
		int u = (i == 2) ? 3 : ((i == 3) ? 2 : i);
		ceiling.push_back(new Vertex((vect[u])->X(), (vect[u])->Y(), height));
	}
	faces->push_back(new Face(new std::vector<Vertex*>(ceiling)));
	
	unsigned int n = vect.size();
	for (unsigned int i = 0; i < n; ++i)
	{
		Vertex vL(*(vect[i]));
		Vertex vR(*(vect[(i+1)%n]));
		double wins = Distance(vL,vR) / (height-base);
		
		if (wins == 1)
		{
			Vertex *v = PointOnALine(vL, vR, 0.5f);
			CreateWindow(vL, *v, base, height);
			CreateWindow(*v, vR, base, height);
			delete v;
		}
		else
		{
			double step =  1.f / wins;
			double currentS = step;
			Vertex *v = PointOnALine(vL, vR, currentS);
			Vertex *v2;
			CreateWindow(vL, *v, base, height);
			
			for (int i = 0; i < wins-2; i++)
			{
				currentS += step;
				v2 = PointOnALine(vL, vR , currentS);
				CreateWindow(*v, *v2, base, height);
				delete v;
				v = v2;
			}
			
			CreateWindow(*v, vR, base, height);
			delete v;
		}
	}
}
示例#4
0
void CLightningFX::PreRender( float tmFrameTime )
{
	
	LTVector vPulse;
	LTVector vF(0.0f, 0.0f, 1.0f);
	LTVector vU(0.0f, 1.0f, 0.0f);
	LTVector vR(1.0f, 0.0f, 0.0f);

	
	// Transform the bolt 

	LTMatrix mCam;
	if( m_bReallyClose )
	{
		mCam.Identity();
	}
	else
	{
		mCam = GetCamTransform(m_pLTClient, m_hCamera);
	}
	 
	
	CLightningBolt *pBolt = LTNULL;
	LightningBolts::iterator iter;
	for( iter = m_lstBolts.begin(); iter != m_lstBolts.end(); ++iter )
	{
		pBolt = *iter;

		// Skip this bolt if there are not enough segments...

		if( pBolt->m_collPathPts.GetSize() < 2 || !pBolt->m_bActive )
			continue;

		CLinkListNode<PT_TRAIL_SECTION> *pNode = pBolt->m_collPathPts.GetHead();

		//as long as some amount of time has passed, apply a pulse onto the bolt to make
		//it jitter
		if(tmFrameTime > 0.001f)
		{
			while (pNode)
			{
				vPulse = pNode->m_Data.m_vPos;
				vPulse += (vF * GetRandom( -GetProps()->m_fPulse, GetProps()->m_fPulse ));
				vPulse += (vU * GetRandom( -GetProps()->m_fPulse, GetProps()->m_fPulse ));
				vPulse += (vR * GetRandom( -GetProps()->m_fPulse, GetProps()->m_fPulse ));

				if( pNode == pBolt->m_collPathPts.GetHead() || !pNode->m_pNext )
				{
					MatVMul(&pNode->m_Data.m_vTran, &mCam, &pNode->m_Data.m_vPos);
				}
				else
				{
					MatVMul(&pNode->m_Data.m_vTran, &mCam, &vPulse);
				}

				pNode = pNode->m_pNext;
			}
		}

		// Do some precalculations

		float fScale;
		CalcScale( pBolt->m_tmElapsed, pBolt->m_fLifetime, &fScale );
		float fWidth = pBolt->m_fWidth * fScale;

		// Setup the colour
		
		float r, g, b, a;			
		CalcColour( pBolt->m_tmElapsed, pBolt->m_fLifetime, &r, &g, &b, &a );			

		int ir = Clamp( (int)(r * 255.0f), 0, 255 );
		int ig = Clamp( (int)(g * 255.0f), 0, 255 );
		int ib = Clamp( (int)(b * 255.0f), 0, 255 );
		int ia = Clamp( (int)(a * 255.0f), 0, 255 );

		LTVector vStart, vEnd, vPrev, vBisector;
		vBisector.z = 0.0f;

		pNode = pBolt->m_collPathPts.GetHead();

		while( pNode )
		{
			if( GetProps()->m_eAllignment == ePTA_Camera )
			{
				// Compute the midpoint vectors

				if( pNode == pBolt->m_collPathPts.GetHead() )
				{
					vStart = pNode->m_Data.m_vTran;
					vEnd   = pNode->m_pNext->m_Data.m_vTran;
					
					vBisector.x = vEnd.y - vStart.y;
					vBisector.y = -(vEnd.x - vStart.x);
				}
				else if( pNode == pBolt->m_collPathPts.GetTail() )
				{
					vEnd   = pNode->m_Data.m_vTran;
					vStart = pNode->m_pPrev->m_Data.m_vTran;
					
					vBisector.x = vEnd.y - vStart.y;
					vBisector.y = -(vEnd.x - vStart.x);
				}
				else
				{
					vPrev  = pNode->m_pPrev->m_Data.m_vTran;
					vStart = pNode->m_Data.m_vTran;
					vEnd   = pNode->m_pNext->m_Data.m_vTran;

					float x1 = vEnd.y - vStart.y;
					float y1 = -(vEnd.x - vStart.x);
					float z1 = vStart.z - vEnd.z;

					float x2 = vStart.y - vPrev.y;
					float y2 = -(vStart.x - vPrev.x);
					float z2 = vPrev.z - vEnd.z;
					
					vBisector.x = (x1 + x2) / 2.0f;
					vBisector.y = (y1 + y2) / 2.0f;
				}

				pNode->m_Data.m_vBisector = vBisector;
			}
			
			// Set the width for this section...

			pNode->m_Data.m_vBisector.Norm( fWidth );
			
			// Set the color for this section...

			pNode->m_Data.m_red = ir;
			pNode->m_Data.m_green = ig;
			pNode->m_Data.m_blue = ib;
			pNode->m_Data.m_alpha = ia;
		
			pNode = pNode->m_pNext;
		}
	}
}
示例#5
0
bool CLTBModelFX::Update(float tmFrameTime)
{

	//Ok, what we are going to do is see if we are supposed to be sync'd to the
	//animation. If so, we are going to flat out ignore tmCur, and instead generate
	//our own. This way we can match the model exactly.
	if(GetProps()->m_bSyncToModelAnim)
	{
		//we need to find out where in the animation the model currently is
		ILTModel		*pLTModel = m_pLTClient->GetModelLT();
		ANIMTRACKERID	nTracker;
		
		if(pLTModel->GetMainTracker( m_hObject, nTracker ) == LT_OK)
		{
			//we have the main tracker, see where in its timeline it is
			uint32 nCurrTime;
			uint32 nAnimTime;

			pLTModel->GetCurAnimTime(m_hObject, nTracker, nCurrTime);
			pLTModel->GetCurAnimLength(m_hObject, nTracker, nAnimTime);

			if(nAnimTime)
			{
				//handle wrapping
				nCurrTime %= nAnimTime;

				//ok, now convert cur time to a valid time
				m_tmElapsed = (nCurrTime * GetProps()->m_tmLifespan) / (float)nAnimTime;
			}
			else
			{
				//zero length animation?
				m_tmElapsed = 0.0f;
			}
		}
	}
	else if(GetProps()->m_bSyncToKey)
	{
		//we need to find out where in the key we currently are
		ILTModel		*pLTModel = m_pLTClient->GetModelLT();
		ANIMTRACKERID	nTracker;
		
		if(pLTModel->GetMainTracker( m_hObject, nTracker ) == LT_OK)
		{
			//we have the main tracker, see where in its timeline it is
			uint32 nAnimLength;
			m_pLTClient->GetModelLT()->ResetAnim( m_hObject, nTracker );
			pLTModel->GetCurAnimLength(m_hObject, nTracker, nAnimLength);

			if(nAnimLength > 0)
				nAnimLength--;

			float tmWrappedTime = fmodf(m_tmElapsed / GetProps()->m_tmLifespan, 1.0f);
			uint32 nAnimTime = (uint32)(tmWrappedTime * nAnimLength);
			pLTModel->SetCurAnimTime(m_hObject, nTracker, nAnimTime);
		}
	}
	
	// Base class update first	
	if (!CBaseFX::Update(tmFrameTime)) 
		return false;


	//see if we should reset our model animation
	if(!GetProps()->m_bSyncToKey && IsFinishedShuttingDown())
	{
		//Reset the animation
		ANIMTRACKERID	nTracker;
		
		m_pLTClient->GetModelLT()->GetMainTracker( m_hObject, nTracker );
		m_pLTClient->GetModelLT()->ResetAnim( m_hObject, nTracker );

		if(GetProps()->m_bOverrideAniLength)
			m_pLTClient->GetModelLT()->SetAnimRate( m_hObject, nTracker, m_fAniRate);
	}

	// Align if neccessary, to the rotation of our parent

	if ((m_hParent) && (GetProps()->m_nFacing == FACE_PARENTALIGN))
	{
		LTRotation rParentRot;
		m_pLTClient->GetObjectRotation(m_hParent, &rParentRot);
		rParentRot = (GetProps()->m_bRotate ? rParentRot : rParentRot * m_rNormalRot);
		m_pLTClient->SetObjectRotation(m_hObject, &rParentRot);
	}
	

	// If we want to add a rotation, make sure we are facing the correct way...
	
	if( GetProps()->m_bRotate )
	{
		LTFLOAT		tmFrame = tmFrameTime;
		LTVector	vR( m_rRot.Right() );
		LTVector	vU( m_rRot.Up() );
		LTVector	vF( m_rRot.Forward() );

		LTRotation	rRotation;

		if( m_hCamera && (GetProps()->m_nFacing == FACE_CAMERAFACING))
		{
			m_pLTClient->GetObjectRotation( m_hCamera, &rRotation );
		}
		else
		{
			m_pLTClient->GetObjectRotation( m_hObject, &rRotation );
		}

		m_rRot.Rotate( vR, MATH_DEGREES_TO_RADIANS( GetProps()->m_vRotAdd.x * tmFrame ));
		m_rRot.Rotate( vU, MATH_DEGREES_TO_RADIANS( GetProps()->m_vRotAdd.y * tmFrame ));
		m_rRot.Rotate( vF, MATH_DEGREES_TO_RADIANS( GetProps()->m_vRotAdd.z * tmFrame ));
		
		rRotation = rRotation * m_rRot;
		
		m_pLTClient->SetObjectRotation( m_hObject, &(rRotation * m_rNormalRot));
	}
	else if( GetProps()->m_nFacing == FACE_CAMERAFACING )
	{
		LTRotation rCamRot;

		m_pLTClient->GetObjectRotation( m_hCamera, &rCamRot );
		m_pLTClient->SetObjectRotation( m_hObject, &(rCamRot * m_rNormalRot) );
	}

	// Success !!

	return true;
}
示例#6
0
//////////////////////////////////////////////////////////////////////
/// Draw
void COGLWin::Draw()
{

	if (!m_Parse.IsCodeOK())
	{
		m_ToolBox.ResetToolInUseFlags();
		// Keep fixed tools but do not redraw here
		m_ToolBox.PruneToolMap(true, false);
		// Redraw tools here explicitly
//		m_ToolBox.Update();

		if (m_pOutput)
			m_pOutput->SetText(" ");
	
		// Standard reason for re-evaluation of script.
		SetExecModeVar(EXEC_MODE_NONE);

		return;
	}

	// Set standard color
	if (m_bUseLighting)
	{
		m_Filter.SetColor(MGray);
		m_StdMaterial.Apply();
	}
	else
	{
		m_Filter.SetColor(MGray);
	}

	m_ToolBox.ResetToolInUseFlags();
	m_Parse.ToggleTempImageList();
	m_Parse.ResetTempImageList();

	// Reset Filter Modes
	m_Filter.ResetModes();
	m_bFrameTransChanged = false;
	MultiV<float> vR(m_vRMain);

	m_mTransform[0].ResetTransChanged();

	ClearOutput();
	ClearError();
	//m_Parse.ResetTempVexList();

	if (!m_Parse.RunCode())
	{
		int iErrLine, iErrPos, iErrInPos;
		cStr csErrFile, csText;
		CCLUCodeBase::SOutputObject OutObj;
/*
		m_sError = "<b>Runtime Errors:</b><p>";
		m_sError += m_Parse.PrintCodeErrors().Str();
		m_sError += "</p> <p>";
		//csText << "Vars:\n" << m_Parse.PrintVars() << "\n";
		m_sError += "<b>Stack:</b><br> <br>";
		m_sError += m_Parse.PrintStack().Str();
		m_sError += "</p>";
*/

		OutObj.sName = "Output up to Error";
		OutObj.bCanChangeSize = false;
		OutObj.bCanHideValue = false;
		OutObj.bBRAfterValue = true;
		OutObj.bBRBeforeValue = true;
		OutObj.bShowInfo = false;
		OutObj.bShowValue = true;
		OutObj.sRelSym = ":";
		OutObj.sType = " ";
		OutObj.iSize = 0;
		OutObj.sValue = " ";
		m_Parse.InsertOutputObject(OutObj);

		OutObj.sName = "Stack";
		OutObj.bCanChangeSize = true;
		OutObj.bCanHideValue = true;
		OutObj.bBRAfterValue = true;
		OutObj.bBRBeforeValue = true;
		OutObj.bShowInfo = false;
		OutObj.bShowValue = false;
		OutObj.sRelSym = ":";
		OutObj.sType = "stack";
		OutObj.iSize = 0;
		OutObj.sValue = m_Parse.PrintStack().Str();
		m_Parse.InsertOutputObject(OutObj);

		OutObj.sName = "Runtime Error";
		OutObj.bCanChangeSize = false;
		OutObj.bCanHideValue = true;
		OutObj.bBRAfterValue = true;
		OutObj.bBRBeforeValue = true;
		OutObj.bShowInfo = true;
		OutObj.bShowValue = true;
		OutObj.sRelSym = " ";
		OutObj.sType = "error message";
		OutObj.iSize = 0;

		m_Parse.GetCodeErrorPos(iErrLine, iErrPos, iErrInPos, csErrFile);
		csText = "";
		csText << "Line " << iErrLine << ", Pos " << iErrPos;
		OutObj.sInfo = csText;

		csText = "<font size=\"10\">File: <i>";
		csText << csErrFile << "</i></font><p>";
		csText << m_Parse.PrintCodeErrors().Str();
		OutObj.sValue = csText;

		m_Parse.InsertOutputObject(OutObj);

		m_bHasError = true;
		m_bHasOutput = true;

/*
		cStr &rText = m_Parse.GetTextOutput();

		if (rText.Len())
		{
			m_sError += "<br><b>Script Output:</b><br> <br>";
			m_sError += rText.Str();
		}
*/
/*
		if (m_pOutput && !m_bVizOnlyMode)
		{
			m_pOutput->SetText(m_sError.c_str());
			m_pOutput->show();
		}
*/		//ClearError();

		if (m_pEditor && !m_bVizOnlyMode)
		{
			cStr csFilename;
			int iLine, iPos, iInputPos;

			if (m_Parse.GetCodeErrorPos(iLine, iPos, iInputPos, csFilename))
				m_pEditor->HighlightLinePos(csFilename.Str(), iInputPos);

			m_pEditor->show();
		}

		m_Parse.ResetErrors();

		m_bExecCode = false;
		SetAnimCode(false);
		StopAnimation();

		m_Parse.OverrideSetRenderLatex(false);
	}
	else 
	{
		//m_vecOutObj = m_Parse.GetOutputObjectList();
		//cStr &rText = m_Parse.GetTextOutput();

		m_bHasOutput = true;

		if (m_mTransform[0].HasTransChanged(0) ||
			m_mTransform[0].HasTransChanged(1) ||
			m_mTransform[0].HasTransChanged(2))
		{
			m_mTransform[0].iFlags = 0;
			m_bFrameTransChanged = true;
		}

		if (vR != m_vRMain)
		{
			m_bFrameTransChanged = true;
		}

		m_Parse.OverrideSetRenderLatex(false);
	}

	// Keep fixed tools but do not redraw here
	m_ToolBox.PruneToolMap(true, false);

	// Redraw tools here explicitly
//	m_ToolBox.Update();

	// Reset Tool Name Variable
	if (m_iExecMode & 
		(EXEC_MODE_TOOL | EXEC_MODE_LINK | EXEC_MODE_KEYUP | EXEC_MODE_KEYDOWN | EXEC_MODE_ANIM))
	{
		SetToolNameVar("None");
		SetLinkDataVar("None");
	}

	// Standard reason for re-evaluation of script.
	SetExecModeVar(EXEC_MODE_NONE);
}