Mana
Function.h
Go to the documentation of this file.
1 
8 #pragma once
9 #include "common/Setup.h"
10 #include "VM.h"
11 #include <cmath>
12 #include <cstdlib>
13 
14 namespace mana
15 {
16  struct Vector2
17  {
18  float x, y;
19  };
20 
21  struct Vector3
22  {
23  float x, y, z;
24  };
25 
26  struct Vector4
27  {
28  float x, y, z, w;
29  };
30 
31  struct Color
32  {
33  float r, g, b, a;
34  };
35 
36  namespace builtInFunction
37  {
38  inline void IsDebug(const std::shared_ptr<Actor>& actor)
39  {
40  MANA_ASSERT_PARAMETER(actor, 0);
41 #if MANA_BUILD_TARGET < MANA_BUILD_RELEASE
42  actor->SetReturnInteger(1);
43 #else
44  actor->SetReturnInteger(0);
45 #endif
46  }
47 
48  inline void RandI(const std::shared_ptr<Actor>& actor)
49  {
50  MANA_ASSERT_PARAMETER(actor, 2);
51 
52  const int32_t min_ = actor->GetParameterInteger(0);
53  const int32_t max_ = actor->GetParameterInteger(1);
54  actor->SetReturnInteger(min_ + ((static_cast<uint32_t>(rand() & 32767) * (max_ - min_)) >> 15));
55  }
56 
57  inline void RandF(const std::shared_ptr<Actor>& actor)
58  {
59  MANA_ASSERT_PARAMETER(actor, 0);
60  actor->SetReturnFloat(static_cast<float>(rand() & 32767) / 32768.0f);
61  }
62 
63  inline void Delay(const std::shared_ptr<Actor>& actor)
64  {
65  MANA_ASSERT_PARAMETER(actor, 1);
66 
67  if (actor->GetVirtualMachine()->IsFrameChanged())
68  {
69  const int32_t frame = actor->GetParameterInteger(0);
70  if (frame > 0)
71  actor->Repeat(true);
72  actor->GetStack().Set<int32_t>(0, frame - 1);
73  }
74  else
75  {
76  actor->Repeat(true);
77  }
78  }
79 
80  inline void Sin(const std::shared_ptr<Actor>& actor)
81  {
82  MANA_ASSERT_PARAMETER(actor, 1);
83 
84  const float degree = actor->GetParameterFloat(0);
85  const float radian = ToRadian(AngleMod<float>(degree, 180.f));
86  const float answer = std::sin(radian);
87 
88  actor->SetReturnFloat(answer);
89  }
90 
91  inline void Cos(const std::shared_ptr<Actor>& actor)
92  {
93  MANA_ASSERT_PARAMETER(actor, 1);
94 
95  const float degree = actor->GetParameterFloat(0);
96  const float radian = ToRadian(AngleMod<float>(degree, 180.f));
97  const float answer = std::cos(radian);
98 
99  actor->SetReturnFloat(answer);
100  }
101 
102  inline void Atan2(const std::shared_ptr<Actor>& actor)
103  {
104  MANA_ASSERT_PARAMETER(actor, 2);
105 
106  const float x = actor->GetParameterFloat(0);
107  const float z = actor->GetParameterFloat(1);
108  const float a = ToDegree(std::atan2(z, x));
109 
110  actor->SetReturnFloat(a);
111  }
112 
113  inline void Tan(const std::shared_ptr<Actor>& actor)
114  {
115  MANA_ASSERT_PARAMETER(actor, 1);
116 
117  const float degree = actor->GetParameterFloat(0);
118  const float radian = ToRadian(AngleMod<float>(degree, 180.f));
119  const float answer = std::tan(radian);
120 
121  actor->SetReturnFloat(answer);
122  }
123 
124  inline void AngleMod(const std::shared_ptr<Actor>& actor)
125  {
126  MANA_ASSERT_PARAMETER(actor, 1);
127 
128  const float degree = actor->GetParameterFloat(0);
129  const float answer = mana::AngleMod<float>(degree, 180.f);
130 
131  actor->SetReturnFloat(answer);
132  }
133 
134  inline void Sqrt(const std::shared_ptr<Actor>& actor)
135  {
136  MANA_ASSERT_PARAMETER(actor, 1);
137 
138  const float value = actor->GetParameterFloat(0);
139  const float answer = std::sqrt(value);
140 
141  actor->SetReturnFloat(answer);
142  }
143 
144  inline void FindActor(const std::shared_ptr<Actor>& actor)
145  {
146  MANA_ASSERT_PARAMETER(actor, 1);
147 
148  const char* name = actor->GetParameterString(0);
149  actor->SetReturnActor(actor->GetVirtualMachine()->GetActor(name));
150  }
151  }
152 
156  inline void FunctionInitialize(VM& vm)
157  {
169  }
170 }
#define MANA_ASSERT_PARAMETER(P, I)
引数の数を調べ、一致しない場合はreturnします
Definition: Actor.h:302
Definition: VM.h:21
void RegisterFunction(const std::string &name, const ExternalFunctionType &function)
Definition: VM.inl:32
void Tan(const std::shared_ptr< Actor > &actor)
Definition: Function.h:113
void RandF(const std::shared_ptr< Actor > &actor)
Definition: Function.h:57
void RandI(const std::shared_ptr< Actor > &actor)
Definition: Function.h:48
void FindActor(const std::shared_ptr< Actor > &actor)
Definition: Function.h:144
void Sqrt(const std::shared_ptr< Actor > &actor)
Definition: Function.h:134
void Delay(const std::shared_ptr< Actor > &actor)
Definition: Function.h:63
void IsDebug(const std::shared_ptr< Actor > &actor)
Definition: Function.h:38
void AngleMod(const std::shared_ptr< Actor > &actor)
Definition: Function.h:124
void Cos(const std::shared_ptr< Actor > &actor)
Definition: Function.h:91
void Atan2(const std::shared_ptr< Actor > &actor)
Definition: Function.h:102
void Sin(const std::shared_ptr< Actor > &actor)
Definition: Function.h:80
Definition: CodeBuffer.cpp:12
void FunctionInitialize(VM &vm)
Definition: Function.h:156
constexpr T ToRadian(T degree)
Definition: Math.h:61
constexpr T ToDegree(T radian)
Definition: Math.h:67
Definition: Function.h:32
float b
Definition: Function.h:33
float r
Definition: Function.h:33
float g
Definition: Function.h:33
float a
Definition: Function.h:33
Definition: Function.h:17
float y
Definition: Function.h:18
float x
Definition: Function.h:18
Definition: Function.h:22
float y
Definition: Function.h:23
float z
Definition: Function.h:23
float x
Definition: Function.h:23
Definition: Function.h:27
float z
Definition: Function.h:28
float y
Definition: Function.h:28
float w
Definition: Function.h:28
float x
Definition: Function.h:28