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; } }
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; } }
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; } }
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; }