blender/source/gameengine/Expressions/Operator1Expr.cpp
2011-12-30 07:55:15 +00:00

151 lines
2.9 KiB
C++

/** \file gameengine/Expressions/Operator1Expr.cpp
* \ingroup expressions
*/
// Operator1Expr.cpp: implementation of the COperator1Expr class.
/*
* Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org>
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Erwin Coumans makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*/
#include "Operator1Expr.h"
#include "EmptyValue.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
COperator1Expr::COperator1Expr()
/*
pre:
effect: constucts an empty COperator1Expr
*/
{
m_lhs = NULL;
}
COperator1Expr::COperator1Expr(VALUE_OPERATOR op, CExpression * lhs)
/*
pre:
effect: constucts a COperator1Expr with op and lhs in it
*/
{
m_lhs = lhs;
m_op = op;
}
COperator1Expr::~COperator1Expr()
/*
pre:
effect: deletes the object
*/
{
if (m_lhs) m_lhs->Release();
}
CValue * COperator1Expr::Calculate()
/*
pre:
ret: a new object containing the result of applying the operator m_op to the
value of m_lhs
*/
{
CValue *ret;
CValue *temp = m_lhs->Calculate();
CValue* empty = new CEmptyValue();
ret = empty->Calc(m_op, temp);
empty->Release();
temp->Release();
return ret;
}
/*
bool COperator1Expr::IsInside(float x, float y, float z,bool bBorderInclude)
{
bool result = true;
switch (m_op)
{
case VALUE_ADD_OPERATOR:
{
if (m_lhs)
{
result = result || m_lhs->IsInside(x,y,z,bBorderInclude);
}
break;
}
case VALUE_SUB_OPERATOR:
{
result = true;
if (m_lhs)
{
result = result && (!m_lhs->IsInside(x,y,z,bBorderInclude));
}
break;
}
}
return result;
}
*/
bool COperator1Expr::NeedsRecalculated()
{
return m_lhs->NeedsRecalculated();
}
CExpression* COperator1Expr::CheckLink(std::vector<CBrokenLinkInfo*>& brokenlinks) {
CExpression* newlhs = m_lhs->CheckLink(brokenlinks);
if (newlhs)
{
if (newlhs==m_lhs) {
// not changed
} else {
// changed
//numchanges++;
newlhs->AddRef();
//m_lhs->Release();
brokenlinks.push_back(new CBrokenLinkInfo(&m_lhs,m_lhs));
m_lhs = newlhs;
}
return this;
} else {
//numchanges++;
AddRef();
return Release();
}
}
void COperator1Expr::BroadcastOperators(VALUE_OPERATOR op)
{
if (m_lhs)
m_lhs->BroadcastOperators(m_op);
}
bool COperator1Expr::MergeExpression(CExpression *otherexpr)
{
if (m_lhs)
return m_lhs->MergeExpression(otherexpr);
assertd(false); // should not get here, expression is not compatible for merge
return false;
}