786 lines
16 KiB
C++
786 lines
16 KiB
C++
/*************************************************************************/
|
|
/* test_math.cpp */
|
|
/*************************************************************************/
|
|
/* This file is part of: */
|
|
/* GODOT ENGINE */
|
|
/* http://www.godotengine.org */
|
|
/*************************************************************************/
|
|
/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
|
|
/* */
|
|
/* Permission is hereby granted, free of charge, to any person obtaining */
|
|
/* a copy of this software and associated documentation files (the */
|
|
/* "Software"), to deal in the Software without restriction, including */
|
|
/* without limitation the rights to use, copy, modify, merge, publish, */
|
|
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
|
/* permit persons to whom the Software is furnished to do so, subject to */
|
|
/* the following conditions: */
|
|
/* */
|
|
/* The above copyright notice and this permission notice shall be */
|
|
/* included in all copies or substantial portions of the Software. */
|
|
/* */
|
|
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
|
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
|
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
|
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
|
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
|
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
|
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
|
/*************************************************************************/
|
|
#include "test_math.h"
|
|
#include "ustring.h"
|
|
#include "print_string.h"
|
|
#include "transform.h"
|
|
#include "matrix3.h"
|
|
#include "math_funcs.h"
|
|
#include "camera_matrix.h"
|
|
#include "scene/main/node.h"
|
|
#include "variant.h"
|
|
#include "servers/visual/shader_language.h"
|
|
#include "os/keyboard.h"
|
|
#include "scene/resources/texture.h"
|
|
#include "vmap.h"
|
|
#include "os/os.h"
|
|
#include "os/file_access.h"
|
|
|
|
#include "method_ptrcall.h"
|
|
|
|
namespace TestMath {
|
|
|
|
|
|
class GetClassAndNamespace {
|
|
|
|
String code;
|
|
int idx;
|
|
int line;
|
|
String error_str;
|
|
bool error;
|
|
Variant value;
|
|
|
|
String class_name;
|
|
|
|
enum Token {
|
|
TK_BRACKET_OPEN,
|
|
TK_BRACKET_CLOSE,
|
|
TK_CURLY_BRACKET_OPEN,
|
|
TK_CURLY_BRACKET_CLOSE,
|
|
TK_PERIOD,
|
|
TK_COLON,
|
|
TK_COMMA,
|
|
TK_SYMBOL,
|
|
TK_IDENTIFIER,
|
|
TK_STRING,
|
|
TK_NUMBER,
|
|
TK_EOF,
|
|
TK_ERROR
|
|
};
|
|
|
|
|
|
Token get_token() {
|
|
|
|
while (true) {
|
|
switch(code[idx]) {
|
|
|
|
case '\n': {
|
|
|
|
line++;
|
|
idx++;
|
|
break;
|
|
};
|
|
case 0: {
|
|
return TK_EOF;
|
|
|
|
} break;
|
|
case '{': {
|
|
|
|
idx++;
|
|
return TK_CURLY_BRACKET_OPEN;
|
|
};
|
|
case '}': {
|
|
|
|
idx++;
|
|
return TK_CURLY_BRACKET_CLOSE;
|
|
};
|
|
case '[': {
|
|
|
|
idx++;
|
|
return TK_BRACKET_OPEN;
|
|
};
|
|
case ']': {
|
|
|
|
idx++;
|
|
return TK_BRACKET_CLOSE;
|
|
};
|
|
case ':': {
|
|
|
|
idx++;
|
|
return TK_COLON;
|
|
};
|
|
case ',': {
|
|
|
|
idx++;
|
|
return TK_COMMA;
|
|
};
|
|
case '.': {
|
|
|
|
idx++;
|
|
return TK_PERIOD;
|
|
};
|
|
case '#': {
|
|
//compiler directive
|
|
while(code[idx]!='\n' && code[idx]!=0) {
|
|
idx++;
|
|
}
|
|
continue;
|
|
} break;
|
|
case '/': {
|
|
|
|
|
|
switch(code[idx+1]) {
|
|
case '*': { // block comment
|
|
|
|
idx+=2;
|
|
while(true) {
|
|
if (code[idx]==0) {
|
|
error_str="Unterminated comment";
|
|
error=true;
|
|
return TK_ERROR;
|
|
} if (code[idx]=='*' &&code[idx+1]=='/') {
|
|
|
|
idx+=2;
|
|
break;
|
|
} if (code[idx]=='\n') {
|
|
line++;
|
|
}
|
|
|
|
idx++;
|
|
}
|
|
|
|
} break;
|
|
case '/': { // line comment skip
|
|
|
|
while(code[idx]!='\n' && code[idx]!=0) {
|
|
idx++;
|
|
}
|
|
|
|
} break;
|
|
default: {
|
|
value="/";
|
|
idx++;
|
|
return TK_SYMBOL;
|
|
}
|
|
|
|
}
|
|
|
|
continue; // a comment
|
|
} break;
|
|
case '\'':
|
|
case '"': {
|
|
|
|
CharType begin_str = code[idx];
|
|
idx++;
|
|
String tk_string=String();
|
|
while(true) {
|
|
if (code[idx]==0) {
|
|
error_str="Unterminated String";
|
|
error=true;
|
|
return TK_ERROR;
|
|
} else if (code[idx]==begin_str) {
|
|
idx++;
|
|
break;
|
|
} else if (code[idx]=='\\') {
|
|
//escaped characters...
|
|
idx++;
|
|
CharType next = code[idx];
|
|
if (next==0) {
|
|
error_str="Unterminated String";
|
|
error=true;
|
|
return TK_ERROR;
|
|
}
|
|
CharType res=0;
|
|
|
|
switch(next) {
|
|
|
|
case 'b': res=8; break;
|
|
case 't': res=9; break;
|
|
case 'n': res=10; break;
|
|
case 'f': res=12; break;
|
|
case 'r': res=13; break;
|
|
/* too much, not needed for now
|
|
case 'u': {
|
|
//hexnumbarh - oct is deprecated
|
|
|
|
|
|
for(int j=0;j<4;j++) {
|
|
CharType c = code[idx+j+1];
|
|
if (c==0) {
|
|
r_err_str="Unterminated String";
|
|
return ERR_PARSE_ERROR;
|
|
}
|
|
if (!((c>='0' && c<='9') || (c>='a' && c<='f') || (c>='A' && c<='F'))) {
|
|
|
|
r_err_str="Malformed hex constant in string";
|
|
return ERR_PARSE_ERROR;
|
|
}
|
|
CharType v;
|
|
if (c>='0' && c<='9') {
|
|
v=c-'0';
|
|
} else if (c>='a' && c<='f') {
|
|
v=c-'a';
|
|
v+=10;
|
|
} else if (c>='A' && c<='F') {
|
|
v=c-'A';
|
|
v+=10;
|
|
} else {
|
|
ERR_PRINT("BUG");
|
|
v=0;
|
|
}
|
|
|
|
res<<=4;
|
|
res|=v;
|
|
|
|
|
|
}
|
|
idx+=4; //will add at the end anyway
|
|
|
|
|
|
} break;*/
|
|
case '\"': res='\"'; break;
|
|
case '\\': res='\\'; break;
|
|
//case '/': res='/'; break;
|
|
default: {
|
|
res = next;
|
|
//r_err_str="Invalid escape sequence";
|
|
//return ERR_PARSE_ERROR;
|
|
} break;
|
|
}
|
|
|
|
tk_string+=res;
|
|
|
|
} else {
|
|
if (code[idx]=='\n')
|
|
line++;
|
|
tk_string+=code[idx];
|
|
}
|
|
idx++;
|
|
}
|
|
|
|
value=tk_string;
|
|
|
|
return TK_STRING;
|
|
|
|
} break;
|
|
default: {
|
|
|
|
if (code[idx]<=32) {
|
|
idx++;
|
|
break;
|
|
}
|
|
|
|
if ( (code[idx]>=33 && code[idx]<=47) || (code[idx]>=58 && code[idx]<=64) || (code[idx]>=91 && code[idx]<=96) || (code[idx]>=123 && code[idx]<=127)){
|
|
value=String::chr(code[idx]);
|
|
idx++;
|
|
return TK_SYMBOL;
|
|
}
|
|
|
|
if (code[idx]=='-' || (code[idx]>='0' && code[idx]<='9')) {
|
|
//a number
|
|
const CharType *rptr;
|
|
double number = String::to_double(&code[idx],&rptr);
|
|
idx+=(rptr - &code[idx]);
|
|
value=number;
|
|
return TK_NUMBER;
|
|
|
|
} else if ((code[idx]>='A' && code[idx]<='Z') || (code[idx]>='a' && code[idx]<='z') || code[idx]>127) {
|
|
|
|
String id;
|
|
|
|
while((code[idx]>='A' && code[idx]<='Z') || (code[idx]>='a' && code[idx]<='z') || code[idx]>127) {
|
|
|
|
id+=code[idx];
|
|
idx++;
|
|
}
|
|
|
|
value=id;
|
|
return TK_IDENTIFIER;
|
|
} else {
|
|
error_str="Unexpected character.";
|
|
error=true;
|
|
return TK_ERROR;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
public:
|
|
Error parse(const String& p_code,const String& p_known_class_name=String()) {
|
|
|
|
code=p_code;
|
|
idx=0;
|
|
line=0;
|
|
error_str=String();
|
|
error=false;
|
|
value=Variant();
|
|
class_name=String();
|
|
|
|
bool use_next_class=false;
|
|
Token tk = get_token();
|
|
|
|
Map<int,String> namespace_stack;
|
|
int curly_stack=0;
|
|
|
|
|
|
while(!error || tk!=TK_EOF) {
|
|
|
|
if (tk==TK_BRACKET_OPEN) {
|
|
tk = get_token();
|
|
if (tk==TK_IDENTIFIER && String(value)=="ScriptClass") {
|
|
if (get_token()==TK_BRACKET_CLOSE) {
|
|
use_next_class=true;
|
|
}
|
|
}
|
|
} else if (tk==TK_IDENTIFIER && String(value)=="class") {
|
|
tk = get_token();
|
|
if (tk==TK_IDENTIFIER) {
|
|
String name = value;
|
|
if (use_next_class || p_known_class_name==name) {
|
|
for (Map<int,String>::Element *E=namespace_stack.front();E;E=E->next()) {
|
|
class_name+=E->get()+".";
|
|
}
|
|
class_name+=String(value);
|
|
break;
|
|
}
|
|
}
|
|
|
|
} else if (tk==TK_IDENTIFIER && String(value)=="namespace") {
|
|
String name;
|
|
int at_level = curly_stack;
|
|
while(true) {
|
|
tk = get_token();
|
|
if (tk==TK_IDENTIFIER) {
|
|
name+=String(value);
|
|
}
|
|
|
|
tk = get_token();
|
|
if (tk==TK_PERIOD) {
|
|
name+=".";
|
|
} else if (tk==TK_CURLY_BRACKET_OPEN) {
|
|
curly_stack++;
|
|
break;
|
|
} else {
|
|
break; //whathever else
|
|
}
|
|
|
|
}
|
|
|
|
if (name!=String()) {
|
|
namespace_stack[at_level]=name;
|
|
}
|
|
|
|
} else if (tk==TK_CURLY_BRACKET_OPEN) {
|
|
curly_stack++;
|
|
} else if (tk==TK_CURLY_BRACKET_CLOSE) {
|
|
curly_stack--;
|
|
if (namespace_stack.has(curly_stack)) {
|
|
namespace_stack.erase(curly_stack);
|
|
}
|
|
}
|
|
|
|
tk = get_token();
|
|
}
|
|
|
|
if (error)
|
|
return ERR_PARSE_ERROR;
|
|
|
|
|
|
|
|
return OK;
|
|
|
|
}
|
|
|
|
String get_error() {
|
|
return error_str;
|
|
}
|
|
|
|
String get_class() {
|
|
return class_name;
|
|
}
|
|
|
|
};
|
|
|
|
|
|
void test_vec(Plane p_vec) {
|
|
|
|
|
|
CameraMatrix cm;
|
|
cm.set_perspective(45,1,0,100);
|
|
Plane v0=cm.xform4(p_vec);
|
|
|
|
print_line("out: "+v0);
|
|
v0.normal.z = (v0.d/100.0 *2.0-1.0) * v0.d;
|
|
print_line("out_F: "+v0);
|
|
|
|
|
|
/*v0: 0, 0, -0.1, 0.1
|
|
v1: 0, 0, 0, 0.1
|
|
fix: 0, 0, 0, 0.1
|
|
v0: 0, 0, 1.302803, 1.5
|
|
v1: 0, 0, 1.401401, 1.5
|
|
fix: 0, 0, 1.401401, 1.5
|
|
v0: 0, 0, 25.851850, 26
|
|
v1: 0, 0, 25.925926, 26
|
|
fix: 0, 0, 25.925924, 26
|
|
v0: 0, 0, 49.899902, 50
|
|
v1: 0, 0, 49.949947, 50
|
|
fix: 0, 0, 49.949951, 50
|
|
v0: 0, 0, 100, 100
|
|
v1: 0, 0, 100, 100
|
|
fix: 0, 0, 100, 100
|
|
*/
|
|
|
|
|
|
}
|
|
|
|
uint32_t ihash( uint32_t a)
|
|
{
|
|
a = (a+0x7ed55d16) + (a<<12);
|
|
a = (a^0xc761c23c) ^ (a>>19);
|
|
a = (a+0x165667b1) + (a<<5);
|
|
a = (a+0xd3a2646c) ^ (a<<9);
|
|
a = (a+0xfd7046c5) + (a<<3);
|
|
a = (a^0xb55a4f09) ^ (a>>16);
|
|
return a;
|
|
}
|
|
|
|
uint32_t ihash2( uint32_t a) {
|
|
a = (a ^ 61) ^ (a >> 16);
|
|
a = a + (a << 3);
|
|
a = a ^ (a >> 4);
|
|
a = a * 0x27d4eb2d;
|
|
a = a ^ (a >> 15);
|
|
return a;
|
|
}
|
|
|
|
uint32_t ihash3( uint32_t a)
|
|
{
|
|
a = (a+0x479ab41d) + (a<<8);
|
|
a = (a^0xe4aa10ce) ^ (a>>5);
|
|
a = (a+0x9942f0a6) - (a<<14);
|
|
a = (a^0x5aedd67d) ^ (a>>3);
|
|
a = (a+0x17bea992) + (a<<7);
|
|
return a;
|
|
}
|
|
|
|
|
|
|
|
|
|
MainLoop* test() {
|
|
|
|
|
|
List<String> cmdlargs = OS::get_singleton()->get_cmdline_args();
|
|
|
|
if (cmdlargs.empty()) {
|
|
//try editor!
|
|
return NULL;
|
|
}
|
|
|
|
String test = cmdlargs.back()->get();
|
|
|
|
FileAccess *fa = FileAccess::open(test,FileAccess::READ);
|
|
|
|
if (!fa) {
|
|
ERR_EXPLAIN("Could not open file: "+test);
|
|
ERR_FAIL_V(NULL);
|
|
}
|
|
|
|
|
|
Vector<uint8_t> buf;
|
|
int flen = fa->get_len();
|
|
buf.resize(fa->get_len()+1);
|
|
fa->get_buffer(&buf[0],flen);
|
|
buf[flen]=0;
|
|
|
|
|
|
String code;
|
|
code.parse_utf8((const char*)&buf[0]);
|
|
|
|
GetClassAndNamespace getclass;
|
|
if (getclass.parse(code)) {
|
|
print_line("Parse error: "+getclass.get_error());
|
|
} else {
|
|
print_line("Found class: "+getclass.get_class());
|
|
}
|
|
|
|
return NULL;
|
|
|
|
{
|
|
|
|
Vector<int32_t> hashes;
|
|
List<StringName> tl;
|
|
ObjectTypeDB::get_type_list(&tl);
|
|
|
|
|
|
for (List<StringName>::Element *E=tl.front();E;E=E->next()) {
|
|
|
|
Vector<uint8_t> m5b = E->get().operator String().md5_buffer();
|
|
hashes.push_back(hashes.size());
|
|
|
|
}
|
|
|
|
//hashes.resize(50);
|
|
|
|
for(int i=nearest_shift(hashes.size());i<20;i++) {
|
|
|
|
bool success=true;
|
|
for(int s=0;s<10000;s++) {
|
|
Set<uint32_t> existing;
|
|
success=true;
|
|
|
|
for(int j=0;j<hashes.size();j++) {
|
|
|
|
uint32_t eh = ihash2(ihash3(hashes[j]+ihash(s)+s))&((1<<i)-1);
|
|
if (existing.has(eh)) {
|
|
success=false;
|
|
break;
|
|
}
|
|
existing.insert(eh);
|
|
}
|
|
|
|
if (success) {
|
|
print_line("success at "+itos(i)+"/"+itos(nearest_shift(hashes.size()))+" shift "+itos(s));
|
|
break;
|
|
}
|
|
}
|
|
if (success)
|
|
break;
|
|
}
|
|
|
|
print_line("DONE");
|
|
|
|
|
|
|
|
return NULL;
|
|
}
|
|
{
|
|
|
|
|
|
// print_line("NUM: "+itos(237641278346127));
|
|
print_line("NUM: "+itos(-128));
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
{
|
|
Vector3 v(1,2,3);
|
|
v.normalize();
|
|
float a=0.3;
|
|
|
|
//Quat q(v,a);
|
|
Matrix3 m(v,a);
|
|
|
|
Vector3 v2(7,3,1);
|
|
v2.normalize();
|
|
float a2=0.8;
|
|
|
|
//Quat q(v,a);
|
|
Matrix3 m2(v2,a2);
|
|
|
|
Quat q=m;
|
|
Quat q2=m2;
|
|
|
|
Matrix3 m3 = m.inverse() * m2;
|
|
Quat q3 = (q.inverse() * q2);//.normalized();
|
|
|
|
print_line(Quat(m3));
|
|
print_line(q3);
|
|
|
|
print_line("before v: "+v+" a: "+rtos(a));
|
|
q.get_axis_and_angle(v,a);
|
|
print_line("after v: "+v+" a: "+rtos(a));
|
|
}
|
|
|
|
return NULL;
|
|
String ret;
|
|
|
|
List<String> args;
|
|
args.push_back("-l");
|
|
Error err = OS::get_singleton()->execute("/bin/ls",args,true,NULL,&ret);
|
|
print_line("error: "+itos(err));
|
|
print_line(ret);
|
|
|
|
return NULL;
|
|
Matrix3 m3;
|
|
m3.rotate(Vector3(1,0,0),0.2);
|
|
m3.rotate(Vector3(0,1,0),1.77);
|
|
m3.rotate(Vector3(0,0,1),212);
|
|
Matrix3 m32;
|
|
m32.set_euler(m3.get_euler());
|
|
print_line("ELEULEEEEEEEEEEEEEEEEEER: "+m3.get_euler()+" vs "+m32.get_euler());
|
|
|
|
|
|
return NULL;
|
|
|
|
{
|
|
|
|
Dictionary d;
|
|
d["momo"]=1;
|
|
Dictionary b=d;
|
|
b["44"]=4;
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
print_line("inters: "+rtos(Geometry::segment_intersects_circle(Vector2(-5,0),Vector2(-2,0),Vector2(),1.0)));
|
|
|
|
|
|
|
|
print_line("cross: "+Vector3(1,2,3).cross(Vector3(4,5,7)));
|
|
print_line("dot: "+rtos(Vector3(1,2,3).dot(Vector3(4,5,7))));
|
|
print_line("abs: "+Vector3(-1,2,-3).abs());
|
|
print_line("distance_to: "+rtos(Vector3(1,2,3).distance_to(Vector3(4,5,7))));
|
|
print_line("distance_squared_to: "+rtos(Vector3(1,2,3).distance_squared_to(Vector3(4,5,7))));
|
|
print_line("plus: "+(Vector3(1,2,3)+Vector3(Vector3(4,5,7))));
|
|
print_line("minus: "+(Vector3(1,2,3)-Vector3(Vector3(4,5,7))));
|
|
print_line("mul: "+(Vector3(1,2,3)*Vector3(Vector3(4,5,7))));
|
|
print_line("div: "+(Vector3(1,2,3)/Vector3(Vector3(4,5,7))));
|
|
print_line("mul scalar: "+(Vector3(1,2,3)*2));
|
|
print_line("premul scalar: "+(2*Vector3(1,2,3)));
|
|
print_line("div scalar: "+(Vector3(1,2,3)/3.0));
|
|
print_line("length: "+rtos(Vector3(1,2,3).length()));
|
|
print_line("length squared: "+rtos(Vector3(1,2,3).length_squared()));
|
|
print_line("normalized: "+Vector3(1,2,3).normalized());
|
|
print_line("inverse: "+Vector3(1,2,3).inverse());
|
|
|
|
{
|
|
Vector3 v(4,5,7);
|
|
v.normalize();
|
|
print_line("normalize: "+v);
|
|
}
|
|
|
|
{
|
|
Vector3 v(4,5,7);
|
|
v+=Vector3(1,2,3);
|
|
print_line("+=: "+v);
|
|
}
|
|
|
|
{
|
|
Vector3 v(4,5,7);
|
|
v-=Vector3(1,2,3);
|
|
print_line("-=: "+v);
|
|
}
|
|
|
|
{
|
|
Vector3 v(4,5,7);
|
|
v*=Vector3(1,2,3);
|
|
print_line("*=: "+v);
|
|
}
|
|
|
|
{
|
|
Vector3 v(4,5,7);
|
|
v/=Vector3(1,2,3);
|
|
print_line("/=: "+v);
|
|
}
|
|
|
|
{
|
|
Vector3 v(4,5,7);
|
|
v*=2.0;
|
|
print_line("scalar *=: "+v);
|
|
}
|
|
|
|
{
|
|
Vector3 v(4,5,7);
|
|
v/=2.0;
|
|
print_line("scalar /=: "+v);
|
|
}
|
|
|
|
|
|
|
|
#if 0
|
|
print_line(String("C:\\momo\\.\\popo\\..\\gongo").simplify_path());
|
|
print_line(String("res://../popo/..//gongo").simplify_path());
|
|
print_line(String("res://..").simplify_path());
|
|
|
|
|
|
DVector<uint8_t> a;
|
|
DVector<uint8_t> b;
|
|
|
|
a.resize(20);
|
|
b=a;
|
|
b.resize(30);
|
|
a=b;
|
|
#endif
|
|
|
|
#if 0
|
|
String za = String::utf8("á");
|
|
printf("unicode: %x\n",za[0]);
|
|
CharString cs=za.utf8();
|
|
for(int i=0;i<cs.size();i++) {
|
|
uint32_t v = uint8_t(cs[i]);
|
|
printf("%i - %x\n",i,v);
|
|
}
|
|
return NULL;
|
|
|
|
print_line(String("C:\\window\\system\\momo").path_to("C:\\window\\momonga"));
|
|
print_line(String("res://momo/sampler").path_to("res://pindonga"));
|
|
print_line(String("/margarito/terere").path_to("/margarito/pilates"));
|
|
print_line(String("/algo").path_to("/algo"));
|
|
print_line(String("c:").path_to("c:\\"));
|
|
print_line(String("/").path_to("/"));
|
|
|
|
|
|
print_line(itos(sizeof(Variant)));
|
|
return NULL;
|
|
|
|
Vector<StringName> path;
|
|
path.push_back("three");
|
|
path.push_back("two");
|
|
path.push_back("one");
|
|
path.push_back("comeon");
|
|
path.revert();
|
|
|
|
NodePath np(path,true);
|
|
|
|
print_line(np);
|
|
|
|
|
|
return NULL;
|
|
|
|
bool a=2;
|
|
|
|
print_line(Variant(a));
|
|
|
|
|
|
Matrix32 mat2_1;
|
|
mat2_1.rotate(0.5);
|
|
Matrix32 mat2_2;
|
|
mat2_2.translate(Vector2(1,2));
|
|
Matrix32 mat2_3 = mat2_1 * mat2_2;
|
|
mat2_3.affine_invert();
|
|
|
|
print_line(mat2_3.elements[0]);
|
|
print_line(mat2_3.elements[1]);
|
|
print_line(mat2_3.elements[2]);
|
|
|
|
|
|
|
|
Transform mat3_1;
|
|
mat3_1.basis.rotate(Vector3(0,0,1),0.5);
|
|
Transform mat3_2;
|
|
mat3_2.translate(Vector3(1,2,0));
|
|
Transform mat3_3 = mat3_1 * mat3_2;
|
|
mat3_3.affine_invert();
|
|
|
|
print_line(mat3_3.basis.get_axis(0));
|
|
print_line(mat3_3.basis.get_axis(1));
|
|
print_line(mat3_3.origin);
|
|
|
|
#endif
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|