Exemple #1
0
static int GM_CDECL gmfMax(gmThread * a_thread)
{
  GM_CHECK_NUM_PARAMS(2);

  int minType = gmMin<int>(a_thread->ParamType(0), a_thread->ParamType(1));
  if(minType < GM_INT)
  {
    return GM_EXCEPTION;
  }

  int maxType = gmMax<int>(a_thread->ParamType(0), a_thread->ParamType(1));

  if(maxType == GM_INT)
  {
    int valX = a_thread->Param(0).m_value.m_int;
    int valY = a_thread->Param(1).m_value.m_int;
    a_thread->PushInt( gmMax(valX, valY) );

    return GM_OK;
  }
  else if(maxType == GM_FLOAT)
  {
    float valX = gmGetFloatOrIntParamAsFloat(a_thread, 0);
    float valY = gmGetFloatOrIntParamAsFloat(a_thread, 1);
    a_thread->PushFloat( gmMax(valX, valY) );

    return GM_OK;
  }
  else
  {
    return GM_EXCEPTION;
  }
}
Exemple #2
0
static int GM_CDECL gmfLog(gmThread * a_thread)
{
  int numParams = GM_THREAD_ARG->GetNumParams();

  if(numParams == 1) //Natural log
  {
    if(a_thread->ParamType(0) == GM_INT) 
    {
      float floatValue = (float) a_thread->Param(0).m_value.m_int;
      a_thread->PushInt( (int) log(floatValue) );
      return GM_OK;
    }
    else if(a_thread->ParamType(0) == GM_FLOAT) 
    {
      float floatValue = (float) a_thread->Param(0).m_value.m_float;

      a_thread->PushFloat( logf(floatValue) );
      return GM_OK;
    }
    else {return GM_EXCEPTION;}
  }
  else if(numParams == 2) //Log to base params: base, value
  {
    int minType = gmMin<int>(a_thread->ParamType(0), a_thread->ParamType(1));
    if(minType < GM_INT)
    {
      return GM_EXCEPTION;
    }
    int maxType = gmMax<int>(a_thread->ParamType(0), a_thread->ParamType(1));

    if(maxType == GM_INT)
    {
      int base = a_thread->Param(0).m_value.m_int;
      int value = a_thread->Param(1).m_value.m_int;
      
      a_thread->PushInt( (int)( log10f((float)value) / log10f((float)base) ) );

      return GM_OK;
    }
    else if(maxType == GM_FLOAT)
    {
      float base = gmGetFloatOrIntParamAsFloat(a_thread, 0);
      float value = gmGetFloatOrIntParamAsFloat(a_thread, 1);
      
      a_thread->PushFloat( (float)( log10(value) / log10(base) ) );

      return GM_OK;
    }
    else
    {
      return GM_EXCEPTION;
    }
  }
  else
  {
    return GM_EXCEPTION;
  }
}
Exemple #3
0
static int GM_CDECL gmfClamp(gmThread * a_thread)
{
  GM_CHECK_NUM_PARAMS(3);

  //params: min, value, max

  int minType = gmMin3(a_thread->ParamType(0), a_thread->ParamType(1), a_thread->ParamType(2));
  if(minType < GM_INT)
  {
    return GM_EXCEPTION;
  }

  int maxType = gmMax3(a_thread->ParamType(0), a_thread->ParamType(1), a_thread->ParamType(2));

  if(maxType == GM_INT)
  {
    int limitMin = a_thread->Param(0).m_value.m_int;
    int value = a_thread->Param(1).m_value.m_int;
    int limitMax = a_thread->Param(2).m_value.m_int;
    
    a_thread->PushInt( gmClamp(limitMin, value, limitMax) );

    return GM_OK;
  }
  else if(maxType == GM_FLOAT)
  {
    float limitMin = gmGetFloatOrIntParamAsFloat(a_thread, 0);
    float value = gmGetFloatOrIntParamAsFloat(a_thread, 1);
    float limitMax = gmGetFloatOrIntParamAsFloat(a_thread, 2);
    
    a_thread->PushFloat( gmClamp(limitMin, value, limitMax) );

    return GM_OK;
  }
  else
  {
    return GM_EXCEPTION;
  }
}
Exemple #4
0
bool gmMatrix3::opMul( gmThread *a_thread, gmVariable *a_operands )
{
	// Check types
	if(a_operands[0].m_type == gmMatrix3::GetType() && (a_operands[1].m_type != gmMatrix3::GetType()))
	{
		// Get operands
		gmMat3Type *vecObjA = gmMatrix3::GetNative( reinterpret_cast<gmUserObject*>( a_operands[ 0 ].m_value.m_ref ) );

		float fScalar = 0.0f;
		if(!gmGetFloatOrIntParamAsFloat(a_operands[1], fScalar))
		{
			return false;
		}

		gmMat3Type vVec = (*vecObjA) * fScalar;
		gmMatrix3::SetObject(a_thread->GetMachine(), a_operands[0], vVec);
	}
	else if((a_operands[0].m_type != gmMatrix3::GetType()) && a_operands[1].m_type == gmMatrix3::GetType())
	{
		// Get operands
		gmMat3Type *vecObjB = gmMatrix3::GetNative( reinterpret_cast<gmUserObject*>( a_operands[ 1 ].m_value.m_ref ) );

		float fScalar = 0.0f;
		if(!gmGetFloatOrIntParamAsFloat(a_operands[0], fScalar))
		{
			return false;
		}

		gmMat3Type vVec = fScalar * (*vecObjB);
		gmMatrix3::SetObject(a_thread->GetMachine(), a_operands[0], vVec);
	}
	else
	{
		a_operands[0].Nullify();
		return false;
	}
	return true;
}
  static int GM_CDECL RotateZ(gmThread * a_thread)
  {
    GM_CHECK_NUM_PARAMS(1);
    gmVector3* thisVec = (gmVector3*)a_thread->ThisUser_NoChecks();
        
    float angle = 0;
    if(!gmGetFloatOrIntParamAsFloat(a_thread, 0, angle))
    {
      return GM_EXCEPTION;
    }

    gmVector3* newVec = Alloc(a_thread->GetMachine(),false);
    gmVector3::RotateAboutZ(*thisVec, angle, *newVec);
    a_thread->PushNewUser(newVec, GM_VECTOR3);

    return GM_OK;
  }