svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r20849:20855
[blender.git] / source / gameengine / Expressions / IfExpr.cpp
1 // IfExpr.cpp: implementation of the CIfExpr class.
2 /*
3  * Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org>
4  *
5  * Permission to use, copy, modify, distribute and sell this software
6  * and its documentation for any purpose is hereby granted without fee,
7  * provided that the above copyright notice appear in all copies and
8  * that both that copyright notice and this permission notice appear
9  * in supporting documentation.  Erwin Coumans makes no
10  * representations about the suitability of this software for any
11  * purpose.  It is provided "as is" without express or implied warranty.
12  *
13  */
14
15 #include "IfExpr.h"
16 #include "EmptyValue.h"
17 #include "ErrorValue.h"
18 #include "BoolValue.h"
19
20 #ifdef HAVE_CONFIG_H
21 #include <config.h>
22 #endif
23
24 //////////////////////////////////////////////////////////////////////
25 // Construction/Destruction
26 //////////////////////////////////////////////////////////////////////
27
28
29 CIfExpr::CIfExpr()
30 {
31 }
32
33
34
35 CIfExpr::CIfExpr(CExpression *guard, CExpression *e1, CExpression *e2)
36 /*
37 pre:
38 effect: constructs an CifExpr-object corresponding to IF(guard, e1, e2)
39 */
40 {
41         m_guard = guard;
42         m_e1 = e1;
43         m_e2 = e2;
44 }
45
46
47
48 CIfExpr::~CIfExpr()
49 /*
50 pre:
51 effect: dereferences the object
52 */
53 {
54         if (m_guard)
55                 m_guard->Release();
56
57         if (m_e1)
58                 m_e1->Release();
59
60         if (m_e2)
61                 m_e2->Release();
62 }
63
64
65
66 CValue* CIfExpr::Calculate()
67 /*
68 pre:
69 ret: a new object containing the value of m_e1 if m_guard is a boolean TRUE
70          a new object containing the value of m_e2 if m_guard is a boolean FALSE
71          an new errorvalue if m_guard is not a boolean
72 */
73 {
74         CValue *guardval;
75         guardval = m_guard->Calculate();
76         const STR_String& text = guardval->GetText();
77         guardval->Release();
78
79         if (&text == &CBoolValue::sTrueString)
80         {
81                 return m_e1->Calculate();
82         }
83         else if (&text == &CBoolValue::sFalseString)
84         {
85                 return m_e2->Calculate();
86         }
87         else
88         {
89                 return new CErrorValue("Guard should be of boolean type");
90         }
91 }
92
93
94
95 bool CIfExpr::MergeExpression(CExpression *otherexpr)
96 {
97         assertd(false);
98         return false;
99 }
100
101
102
103 bool CIfExpr::IsInside(float x,float y,float z,bool bBorderInclude)
104 {
105         assertd(false);
106         return false;
107 }
108         
109
110
111 bool CIfExpr::NeedsRecalculated() 
112 {
113         return  (m_guard->NeedsRecalculated() ||
114                 m_e1->NeedsRecalculated() ||
115                 m_e2->NeedsRecalculated());
116 }
117
118
119
120 CExpression* CIfExpr::CheckLink(std::vector<CBrokenLinkInfo*>& brokenlinks)
121 {
122         assertd(false);
123         return NULL;
124 }
125
126
127
128 void CIfExpr::ClearModified()
129 {
130         assertd(false);
131 }
132
133
134
135 void CIfExpr::BroadcastOperators(VALUE_OPERATOR op)
136 {
137         assertd(false);
138 }
139
140
141
142 unsigned char CIfExpr::GetExpressionID()
143 {
144         return CIFEXPRESSIONID;
145 }