/*************************************************************************/ /* 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 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::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 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 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 hashes; List tl; ObjectTypeDB::get_type_list(&tl); for (List::Element *E=tl.front();E;E=E->next()) { Vector 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 existing; success=true; for(int j=0;j 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 a; DVector 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 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; } }