RES SpatialPlayer::_get_gizmo_geometry() const { Ref<SurfaceTool> surface_tool( memnew( SurfaceTool )); Ref<FixedMaterial> mat( memnew( FixedMaterial )); mat->set_parameter( FixedMaterial::PARAM_DIFFUSE,Color(0.0,0.6,0.7,0.05) ); mat->set_parameter( FixedMaterial::PARAM_EMISSION,Color(0.5,0.7,0.8) ); mat->set_blend_mode( Material::BLEND_MODE_ADD ); mat->set_flag(Material::FLAG_DOUBLE_SIDED,true); // mat->set_hint(Material::HINT_NO_DEPTH_DRAW,true); surface_tool->begin(Mesh::PRIMITIVE_TRIANGLES); surface_tool->set_material(mat); int sides=16; int sections=24; // float len=1; float deg=Math::deg2rad(params[PARAM_EMISSION_CONE_DEGREES]); if (deg==180) deg=179.5; Vector3 to=Vector3(0,0,-1); for(int j=0;j<sections;j++) { Vector3 p1=Matrix3(Vector3(1,0,0),deg*j/sections).xform(to); Vector3 p2=Matrix3(Vector3(1,0,0),deg*(j+1)/sections).xform(to); for(int i=0;i<sides;i++) { Vector3 p1r = Matrix3(Vector3(0,0,1),Math_PI*2*float(i)/sides).xform(p1); Vector3 p1s = Matrix3(Vector3(0,0,1),Math_PI*2*float(i+1)/sides).xform(p1); Vector3 p2s = Matrix3(Vector3(0,0,1),Math_PI*2*float(i+1)/sides).xform(p2); Vector3 p2r = Matrix3(Vector3(0,0,1),Math_PI*2*float(i)/sides).xform(p2); surface_tool->add_normal(p1r.normalized()); surface_tool->add_vertex(p1r); surface_tool->add_normal(p1s.normalized()); surface_tool->add_vertex(p1s); surface_tool->add_normal(p2s.normalized()); surface_tool->add_vertex(p2s); surface_tool->add_normal(p1r.normalized()); surface_tool->add_vertex(p1r); surface_tool->add_normal(p2s.normalized()); surface_tool->add_vertex(p2s); surface_tool->add_normal(p2r.normalized()); surface_tool->add_vertex(p2r); if (j==sections-1) { surface_tool->add_normal(p2r.normalized()); surface_tool->add_vertex(p2r); surface_tool->add_normal(p2s.normalized()); surface_tool->add_vertex(p2s); surface_tool->add_normal(Vector3(0,0,1)); surface_tool->add_vertex(Vector3()); } } } Ref<Mesh> mesh = surface_tool->commit(); Ref<FixedMaterial> mat_speaker( memnew( FixedMaterial )); mat_speaker->set_parameter( FixedMaterial::PARAM_DIFFUSE,Color(0.3,0.3,0.6) ); mat_speaker->set_parameter( FixedMaterial::PARAM_SPECULAR,Color(0.5,0.5,0.6) ); //mat_speaker->set_blend_mode( Material::BLEND_MODE_MIX); //mat_speaker->set_flag(Material::FLAG_DOUBLE_SIDED,false); //mat_speaker->set_flag(Material::FLAG_UNSHADED,true); surface_tool->begin(Mesh::PRIMITIVE_TRIANGLES); surface_tool->set_material(mat_speaker); // float radius=1; const int speaker_points=8; Vector3 speaker[speaker_points]={ Vector3(0,0,1)*0.15, Vector3(1,1,1)*0.15, Vector3(1,1,0)*0.15, Vector3(2,2,-1)*0.15, Vector3(1,1,-1)*0.15, Vector3(0.8,0.8,-1.2)*0.15, Vector3(0.5,0.5,-1.4)*0.15, Vector3(0.0,0.0,-1.6)*0.15 }; int speaker_sides=10; for(int i = 0; i < speaker_sides ; i++) { Matrix3 ma(Vector3(0,0,1),Math_PI*2*float(i)/speaker_sides); Matrix3 mb(Vector3(0,0,1),Math_PI*2*float(i+1)/speaker_sides); for(int j=0;j<speaker_points-1;j++) { Vector3 points[4]={ ma.xform(speaker[j]), mb.xform(speaker[j]), mb.xform(speaker[j+1]), ma.xform(speaker[j+1]), }; Vector3 n = -Plane(points[0],points[1],points[2]).normal; surface_tool->add_normal(n); surface_tool->add_vertex(points[0]); surface_tool->add_normal(n); surface_tool->add_vertex(points[2]); surface_tool->add_normal(n); surface_tool->add_vertex(points[1]); surface_tool->add_normal(n); surface_tool->add_vertex(points[0]); surface_tool->add_normal(n); surface_tool->add_vertex(points[3]); surface_tool->add_normal(n); surface_tool->add_vertex(points[2]); } } return surface_tool->commit(mesh); }
RES Particles::_get_gizmo_geometry() const { Ref<SurfaceTool> surface_tool( memnew( SurfaceTool )); Ref<FixedMaterial> mat( memnew( FixedMaterial )); mat->set_parameter( FixedMaterial::PARAM_DIFFUSE,Color(0.0,0.6,0.7,0.2) ); mat->set_parameter( FixedMaterial::PARAM_EMISSION,Color(0.5,0.7,0.8) ); mat->set_blend_mode( Material::BLEND_MODE_ADD ); mat->set_flag(Material::FLAG_DOUBLE_SIDED,true); // mat->set_hint(Material::HINT_NO_DEPTH_DRAW,true); surface_tool->begin(Mesh::PRIMITIVE_TRIANGLES); surface_tool->set_material(mat); int sides=16; int sections=24; // float len=1; float deg=Math::deg2rad(var[VAR_SPREAD]*180); if (deg==180) deg=179.5; Vector3 to=Vector3(0,0,-1); for(int j=0;j<sections;j++) { Vector3 p1=Matrix3(Vector3(1,0,0),deg*j/sections).xform(to); Vector3 p2=Matrix3(Vector3(1,0,0),deg*(j+1)/sections).xform(to); for(int i=0;i<sides;i++) { Vector3 p1r = Matrix3(Vector3(0,0,1),Math_PI*2*float(i)/sides).xform(p1); Vector3 p1s = Matrix3(Vector3(0,0,1),Math_PI*2*float(i+1)/sides).xform(p1); Vector3 p2s = Matrix3(Vector3(0,0,1),Math_PI*2*float(i+1)/sides).xform(p2); Vector3 p2r = Matrix3(Vector3(0,0,1),Math_PI*2*float(i)/sides).xform(p2); surface_tool->add_normal(p1r.normalized()); surface_tool->add_vertex(p1r); surface_tool->add_normal(p1s.normalized()); surface_tool->add_vertex(p1s); surface_tool->add_normal(p2s.normalized()); surface_tool->add_vertex(p2s); surface_tool->add_normal(p1r.normalized()); surface_tool->add_vertex(p1r); surface_tool->add_normal(p2s.normalized()); surface_tool->add_vertex(p2s); surface_tool->add_normal(p2r.normalized()); surface_tool->add_vertex(p2r); if (j==sections-1) { surface_tool->add_normal(p2r.normalized()); surface_tool->add_vertex(p2r); surface_tool->add_normal(p2s.normalized()); surface_tool->add_vertex(p2s); surface_tool->add_normal(Vector3(0,0,1)); surface_tool->add_vertex(Vector3()); } } } Ref<Mesh> mesh = surface_tool->commit(); Ref<FixedMaterial> mat_aabb( memnew( FixedMaterial )); mat_aabb->set_parameter( FixedMaterial::PARAM_DIFFUSE,Color(0.8,0.8,0.9,0.7) ); mat_aabb->set_line_width(3); mat_aabb->set_flag( Material::FLAG_UNSHADED, true ); surface_tool->begin(Mesh::PRIMITIVE_LINES); surface_tool->set_material(mat_aabb); for(int i=0;i<12;i++) { Vector3 f,t; visibility_aabb.get_edge(i,f,t); surface_tool->add_vertex(f); surface_tool->add_vertex(t); } return surface_tool->commit(mesh); }
// Entry point for large rotation void Elastic::LRConstitutiveLaw(MPMBase *mptr,Matrix3 du,double delTime,int np,void *properties,ResidualStrains *res) const { // get previous deformation gradient Matrix3 pFnm1 = mptr->GetDeformationGradientMatrix(); // get incremental deformation gradient and decompose it const Matrix3 dF = du.Exponential(incrementalDefGradTerms); Matrix3 dR; Matrix3 dU = dF.RightDecompose(&dR,NULL); // get pinitial rotation R0 Matrix3 R0 = mptr->GetInitialRotation(); // get previous rotation and stretch Matrix3 Rnm1; Matrix3 Unm1 = pFnm1.RightDecompose(&Rnm1,NULL); // get strain increments de = R0T.[(Rnm1T.dU.Rnm1 - I).Unm1].R0 Matrix3 dUrot = dU.RTMR(Rnm1); dUrot(0,0) -= 1.; dUrot(1,1) -= 1.; dUrot(2,2) -= 1.; dUrot *= Unm1; // apply initial rotation to get strain increment in the material coordinates Matrix3 de = dUrot.RTMR(R0); Matrix3 Rtotnm1M3 = Rnm1*R0; Matrix3 *Rtotnm1 = &Rtotnm1M3; // get total rotation Matrix3 Rtot = dR*Rtotnm1M3; if(np==THREED_MPM) mptr->SetRtot(Rtot); // Update total deformation gradient Matrix3 pF = dF*pFnm1; mptr->SetDeformationGradientMatrix(pF); // cast pointer to material-specific data ElasticProperties *p = GetElasticPropertiesPointer(properties); // residual strains (thermal and moisture) in material axes double exxr,eyyr,ezzr; if(np==THREED_MPM) { exxr = p->alpha[0]*res->dT; eyyr = p->alpha[1]*res->dT; ezzr = p->alpha[2]*res->dT; if(DiffusionTask::active) { exxr += p->beta[0]*res->dC; eyyr += p->beta[1]*res->dC; ezzr += p->beta[2]*res->dC; } } else { exxr = p->alpha[1]*res->dT; eyyr = p->alpha[2]*res->dT; ezzr = p->alpha[4]*res->dT; if(DiffusionTask::active) { exxr += p->beta[1]*res->dC; eyyr += p->beta[2]*res->dC; ezzr += p->beta[4]*res->dC; } } Matrix3 er = Matrix3(exxr,0.,0.,eyyr,ezzr); // finish up LRElasticConstitutiveLaw(mptr,de,er,Rtot,dR,Rtotnm1,np,properties,res); }
bool Tween::_calc_delta_val(const Variant& p_initial_val, const Variant& p_final_val, Variant& p_delta_val) { const Variant& initial_val = p_initial_val; const Variant& final_val = p_final_val; Variant& delta_val = p_delta_val; switch(initial_val.get_type()) { case Variant::BOOL: //delta_val = p_final_val; delta_val = (int) p_final_val - (int) p_initial_val; break; case Variant::INT: delta_val = (int) final_val - (int) initial_val; break; case Variant::REAL: delta_val = (real_t) final_val - (real_t) initial_val; break; case Variant::VECTOR2: delta_val = final_val.operator Vector2() - initial_val.operator Vector2(); break; case Variant::VECTOR3: delta_val = final_val.operator Vector3() - initial_val.operator Vector3(); break; case Variant::MATRIX3: { Matrix3 i = initial_val; Matrix3 f = final_val; delta_val = Matrix3(f.elements[0][0] - i.elements[0][0], f.elements[0][1] - i.elements[0][1], f.elements[0][2] - i.elements[0][2], f.elements[1][0] - i.elements[1][0], f.elements[1][1] - i.elements[1][1], f.elements[1][2] - i.elements[1][2], f.elements[2][0] - i.elements[2][0], f.elements[2][1] - i.elements[2][1], f.elements[2][2] - i.elements[2][2] ); } break; case Variant::MATRIX32: { Matrix32 i = initial_val; Matrix32 f = final_val; Matrix32 d = Matrix32(); d[0][0] = f.elements[0][0] - i.elements[0][0]; d[0][1] = f.elements[0][1] - i.elements[0][1]; d[1][0] = f.elements[1][0] - i.elements[1][0]; d[1][1] = f.elements[1][1] - i.elements[1][1]; d[2][0] = f.elements[2][0] - i.elements[2][0]; d[2][1] = f.elements[2][1] - i.elements[2][1]; delta_val = d; } break; case Variant::QUAT: delta_val = final_val.operator Quat() - initial_val.operator Quat(); break; case Variant::_AABB: { AABB i = initial_val; AABB f = final_val; delta_val = AABB(f.pos - i.pos, f.size - i.size); } break; case Variant::TRANSFORM: { Transform i = initial_val; Transform f = final_val; Transform d; d.set(f.basis.elements[0][0] - i.basis.elements[0][0], f.basis.elements[0][1] - i.basis.elements[0][1], f.basis.elements[0][2] - i.basis.elements[0][2], f.basis.elements[1][0] - i.basis.elements[1][0], f.basis.elements[1][1] - i.basis.elements[1][1], f.basis.elements[1][2] - i.basis.elements[1][2], f.basis.elements[2][0] - i.basis.elements[2][0], f.basis.elements[2][1] - i.basis.elements[2][1], f.basis.elements[2][2] - i.basis.elements[2][2], f.origin.x - i.origin.x, f.origin.y - i.origin.y, f.origin.z - i.origin.z ); delta_val = d; } break; case Variant::COLOR: { Color i = initial_val; Color f = final_val; delta_val = Color(f.r - i.r, f.g - i.g, f.b - i.b, f.a - i.a); } break; default: ERR_PRINT("Invalid param type, except(int/real/vector2/vector/matrix/matrix32/quat/aabb/transform/color)"); return false; }; return true; }
void RigidBody::transformInertiaTensor(Matrix3 &iitWorld, const Quaternion &q, const Matrix3 &iitBody) { iitWorld = Matrix3(q) * iitBody * Matrix3(q.inverse()); }
void MeshLibraryEditor::_import_scene(Node *p_scene, Ref<MeshLibrary> p_library, bool p_merge) { if (!p_merge) p_library->clear(); for(int i=0;i<p_scene->get_child_count();i++) { Node *child = p_scene->get_child(i); if (!child->cast_to<MeshInstance>()) { if (child->get_child_count()>0) { child=child->get_child(0); if (!child->cast_to<MeshInstance>()) { continue; } } else continue; } MeshInstance *mi = child->cast_to<MeshInstance>(); Ref<Mesh> mesh=mi->get_mesh(); if (mesh.is_null()) continue; int id = p_library->find_item_name(mi->get_name()); if (id<0) { id=p_library->get_last_unused_item_id(); p_library->create_item(id); p_library->set_item_name(id,mi->get_name()); } p_library->set_item_mesh(id,mesh); Ref<Shape> collision; for(int j=0;j<mi->get_child_count();j++) { #if 1 Node *child2 = mi->get_child(j); if (!child2->cast_to<StaticBody>()) continue; StaticBody *sb = child2->cast_to<StaticBody>(); if (sb->get_shape_count()==0) continue; collision=sb->get_shape(0); if (!collision.is_null()) break; #endif } if (!collision.is_null()) { p_library->set_item_shape(id,collision); } Ref<NavigationMesh> navmesh; for(int j=0;j<mi->get_child_count();j++) { Node *child2 = mi->get_child(j); if (!child2->cast_to<NavigationMeshInstance>()) continue; NavigationMeshInstance *sb = child2->cast_to<NavigationMeshInstance>(); navmesh=sb->get_navigation_mesh(); if (!navmesh.is_null()) break; } if(!navmesh.is_null()){ p_library->set_item_navmesh(id, navmesh); } } //generate previews! if (1) { Vector<int> ids = p_library->get_item_list(); RID vp = VS::get_singleton()->viewport_create(); VS::ViewportRect vr; vr.x=0; vr.y=0; vr.width=EditorSettings::get_singleton()->get("editors/grid_map/preview_size"); vr.height=EditorSettings::get_singleton()->get("editors/grid_map/preview_size"); VS::get_singleton()->viewport_set_rect(vp,vr); VS::get_singleton()->viewport_set_as_render_target(vp,true); VS::get_singleton()->viewport_set_render_target_update_mode(vp,VS::RENDER_TARGET_UPDATE_ALWAYS); RID scen = VS::get_singleton()->scenario_create(); VS::get_singleton()->viewport_set_scenario(vp,scen); RID cam = VS::get_singleton()->camera_create(); VS::get_singleton()->camera_set_transform(cam, Transform() ); VS::get_singleton()->viewport_attach_camera(vp,cam); RID light = VS::get_singleton()->light_create(VS::LIGHT_DIRECTIONAL); RID lightinst = VS::get_singleton()->instance_create2(light,scen); VS::get_singleton()->camera_set_orthogonal(cam,1.0,0.01,1000.0); EditorProgress ep("mlib",TTR("Creating Mesh Library"),ids.size()); for(int i=0;i<ids.size();i++) { int id=ids[i]; Ref<Mesh> mesh = p_library->get_item_mesh(id); if (!mesh.is_valid()) continue; AABB aabb= mesh->get_aabb(); print_line("aabb: "+aabb); Vector3 ofs = aabb.pos + aabb.size*0.5; aabb.pos-=ofs; Transform xform; xform.basis=Matrix3().rotated(Vector3(0,1,0),-Math_PI*0.25); xform.basis = Matrix3().rotated(Vector3(1,0,0),Math_PI*0.25)*xform.basis; AABB rot_aabb = xform.xform(aabb); print_line("rot_aabb: "+rot_aabb); float m = MAX(rot_aabb.size.x,rot_aabb.size.y)*0.5; if (m==0) continue; m=1.0/m; m*=0.5; print_line("scale: "+rtos(m)); xform.basis.scale(Vector3(m,m,m)); xform.origin=-xform.basis.xform(ofs); //-ofs*m; xform.origin.z-=rot_aabb.size.z*2; RID inst = VS::get_singleton()->instance_create2(mesh->get_rid(),scen); VS::get_singleton()->instance_set_transform(inst,xform); ep.step(TTR("Thumbnail.."),i); VS::get_singleton()->viewport_queue_screen_capture(vp); Main::iteration(); Image img = VS::get_singleton()->viewport_get_screen_capture(vp); ERR_CONTINUE(img.empty()); Ref<ImageTexture> it( memnew( ImageTexture )); it->create_from_image(img); p_library->set_item_preview(id,it); //print_line("loaded image, size: "+rtos(m)+" dist: "+rtos(dist)+" empty?"+itos(img.empty())+" w: "+itos(it->get_width())+" h: "+itos(it->get_height())); VS::get_singleton()->free(inst); } VS::get_singleton()->free(lightinst); VS::get_singleton()->free(light); VS::get_singleton()->free(vp); VS::get_singleton()->free(cam); VS::get_singleton()->free(scen); } }
Matrix3 Matrix3::Identity() { return Matrix3(Vector3(1,0,0), Vector3(0,1,0), Vector3(0,0,1)); }
Matrix3 Matrix3::Transpose() const { return Matrix3( GetRow1(), GetRow2(), GetRow3() ); }
Matrix3 Matrix3::DiagonalInverse() const { return Matrix3(1.0f / m_aData[0][0], m_aData[0][1], m_aData[0][2], m_aData[1][0], 1.0f / m_aData[1][1], m_aData[1][2], m_aData[2][0], m_aData[2][1], 1.0f / m_aData[2][2]); }
Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,int &line,String &r_err_str,ResourceParser *p_res_parser) { /* { Error err = get_token(p_stream,token,line,r_err_str); if (err) return err; }*/ if (token.type==TK_CURLY_BRACKET_OPEN) { Dictionary d; Error err = _parse_dictionary(d,p_stream,line,r_err_str,p_res_parser); if (err) return err; value=d; return OK; } else if (token.type==TK_BRACKET_OPEN) { Array a; Error err = _parse_array(a,p_stream,line,r_err_str,p_res_parser); if (err) return err; value=a; return OK; } else if (token.type==TK_IDENTIFIER) { /* VECTOR2, // 5 RECT2, VECTOR3, MATRIX32, PLANE, QUAT, // 10 _AABB, //sorry naming convention fail :( not like it's used often MATRIX3, TRANSFORM, // misc types COLOR, IMAGE, // 15 NODE_PATH, _RID, OBJECT, INPUT_EVENT, DICTIONARY, // 20 ARRAY, // arrays RAW_ARRAY, INT_ARRAY, REAL_ARRAY, STRING_ARRAY, // 25 VECTOR2_ARRAY, VECTOR3_ARRAY, COLOR_ARRAY, VARIANT_MAX */ String id = token.value; if (id=="true") value=true; else if (id=="false") value=false; else if (id=="null") value=Variant(); else if (id=="Vector2"){ Vector<float> args; Error err = _parse_construct<float>(p_stream,args,line,r_err_str); if (err) return err; if (args.size()!=2) { r_err_str="Expected 2 arguments for constructor"; } value=Vector2(args[0],args[1]); return OK; } else if (id=="Rect2"){ Vector<float> args; Error err = _parse_construct<float>(p_stream,args,line,r_err_str); if (err) return err; if (args.size()!=4) { r_err_str="Expected 4 arguments for constructor"; } value=Rect2(args[0],args[1],args[2],args[3]); return OK; } else if (id=="Vector3"){ Vector<float> args; Error err = _parse_construct<float>(p_stream,args,line,r_err_str); if (err) return err; if (args.size()!=3) { r_err_str="Expected 3 arguments for constructor"; } value=Vector3(args[0],args[1],args[2]); return OK; } else if (id=="Matrix32"){ Vector<float> args; Error err = _parse_construct<float>(p_stream,args,line,r_err_str); if (err) return err; if (args.size()!=6) { r_err_str="Expected 6 arguments for constructor"; } Matrix32 m; m[0]=Vector2(args[0],args[1]); m[1]=Vector2(args[2],args[3]); m[2]=Vector2(args[4],args[5]); value=m; return OK; } else if (id=="Plane") { Vector<float> args; Error err = _parse_construct<float>(p_stream,args,line,r_err_str); if (err) return err; if (args.size()!=4) { r_err_str="Expected 4 arguments for constructor"; } value=Plane(args[0],args[1],args[2],args[3]); return OK; } else if (id=="Quat") { Vector<float> args; Error err = _parse_construct<float>(p_stream,args,line,r_err_str); if (err) return err; if (args.size()!=4) { r_err_str="Expected 4 arguments for constructor"; } value=Quat(args[0],args[1],args[2],args[3]); return OK; } else if (id=="AABB"){ Vector<float> args; Error err = _parse_construct<float>(p_stream,args,line,r_err_str); if (err) return err; if (args.size()!=6) { r_err_str="Expected 6 arguments for constructor"; } value=AABB(Vector3(args[0],args[1],args[2]),Vector3(args[3],args[4],args[5])); return OK; } else if (id=="Matrix3"){ Vector<float> args; Error err = _parse_construct<float>(p_stream,args,line,r_err_str); if (err) return err; if (args.size()!=9) { r_err_str="Expected 9 arguments for constructor"; } value=Matrix3(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8]); return OK; } else if (id=="Transform"){ Vector<float> args; Error err = _parse_construct<float>(p_stream,args,line,r_err_str); if (err) return err; if (args.size()!=12) { r_err_str="Expected 12 arguments for constructor"; } value=Transform(Matrix3(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8]),Vector3(args[9],args[10],args[11])); return OK; } else if (id=="Color") { Vector<float> args; Error err = _parse_construct<float>(p_stream,args,line,r_err_str); if (err) return err; if (args.size()!=4) { r_err_str="Expected 4 arguments for constructor"; } value=Color(args[0],args[1],args[2],args[3]); return OK; } else if (id=="Image") { //:| get_token(p_stream,token,line,r_err_str); if (token.type!=TK_PARENTHESIS_OPEN) { r_err_str="Expected '('"; return ERR_PARSE_ERROR; } get_token(p_stream,token,line,r_err_str); if (token.type==TK_PARENTHESIS_CLOSE) { value=Image(); // just an Image() return OK; } else if (token.type!=TK_NUMBER) { r_err_str="Expected number (width)"; return ERR_PARSE_ERROR; } get_token(p_stream,token,line,r_err_str); int width=token.value; if (token.type!=TK_COMMA) { r_err_str="Expected ','"; return ERR_PARSE_ERROR; } get_token(p_stream,token,line,r_err_str); if (token.type!=TK_NUMBER) { r_err_str="Expected number (height)"; return ERR_PARSE_ERROR; } int height=token.value; get_token(p_stream,token,line,r_err_str); if (token.type!=TK_COMMA) { r_err_str="Expected ','"; return ERR_PARSE_ERROR; } get_token(p_stream,token,line,r_err_str); if (token.type!=TK_NUMBER) { r_err_str="Expected number (mipmaps)"; return ERR_PARSE_ERROR; } int mipmaps=token.value; get_token(p_stream,token,line,r_err_str); if (token.type!=TK_COMMA) { r_err_str="Expected ','"; return ERR_PARSE_ERROR; } get_token(p_stream,token,line,r_err_str); if (token.type!=TK_IDENTIFIER) { r_err_str="Expected identifier (format)"; return ERR_PARSE_ERROR; } String sformat=token.value; Image::Format format; if (sformat=="GRAYSCALE") format=Image::FORMAT_GRAYSCALE; else if (sformat=="INTENSITY") format=Image::FORMAT_INTENSITY; else if (sformat=="GRAYSCALE_ALPHA") format=Image::FORMAT_GRAYSCALE_ALPHA; else if (sformat=="RGB") format=Image::FORMAT_RGB; else if (sformat=="RGBA") format=Image::FORMAT_RGBA; else if (sformat=="INDEXED") format=Image::FORMAT_INDEXED; else if (sformat=="INDEXED_ALPHA") format=Image::FORMAT_INDEXED_ALPHA; else if (sformat=="BC1") format=Image::FORMAT_BC1; else if (sformat=="BC2") format=Image::FORMAT_BC2; else if (sformat=="BC3") format=Image::FORMAT_BC3; else if (sformat=="BC4") format=Image::FORMAT_BC4; else if (sformat=="BC5") format=Image::FORMAT_BC5; else if (sformat=="PVRTC2") format=Image::FORMAT_PVRTC2; else if (sformat=="PVRTC2_ALPHA") format=Image::FORMAT_PVRTC2_ALPHA; else if (sformat=="PVRTC4") format=Image::FORMAT_PVRTC4; else if (sformat=="PVRTC4_ALPHA") format=Image::FORMAT_PVRTC4_ALPHA; else if (sformat=="ATC") format=Image::FORMAT_ATC; else if (sformat=="ATC_ALPHA_EXPLICIT") format=Image::FORMAT_ATC_ALPHA_EXPLICIT; else if (sformat=="ATC_ALPHA_INTERPOLATED") format=Image::FORMAT_ATC_ALPHA_INTERPOLATED; else if (sformat=="CUSTOM") format=Image::FORMAT_CUSTOM; else { r_err_str="Invalid image format: '"+sformat+"'"; return ERR_PARSE_ERROR; }; int len = Image::get_image_data_size(width,height,format,mipmaps); DVector<uint8_t> buffer; buffer.resize(len); if (buffer.size()!=len) { r_err_str="Couldn't allocate image buffer of size: "+itos(len); } { DVector<uint8_t>::Write w=buffer.write(); for(int i=0;i<len;i++) { get_token(p_stream,token,line,r_err_str); if (token.type!=TK_COMMA) { r_err_str="Expected ','"; return ERR_PARSE_ERROR; } get_token(p_stream,token,line,r_err_str); if (token.type!=TK_NUMBER) { r_err_str="Expected number"; return ERR_PARSE_ERROR; } w[i]=int(token.value); } } Image img(width,height,mipmaps,format,buffer); value=img; return OK; } else if (id=="NodePath") { get_token(p_stream,token,line,r_err_str); if (token.type!=TK_PARENTHESIS_OPEN) { r_err_str="Expected '('"; return ERR_PARSE_ERROR; } get_token(p_stream,token,line,r_err_str); if (token.type!=TK_STRING) { r_err_str="Expected string as argument for NodePath()"; return ERR_PARSE_ERROR; } value=NodePath(String(token.value)); get_token(p_stream,token,line,r_err_str); if (token.type!=TK_PARENTHESIS_CLOSE) { r_err_str="Expected ')'"; return ERR_PARSE_ERROR; } } else if (id=="RID") { get_token(p_stream,token,line,r_err_str); if (token.type!=TK_PARENTHESIS_OPEN) { r_err_str="Expected '('"; return ERR_PARSE_ERROR; } get_token(p_stream,token,line,r_err_str); if (token.type!=TK_NUMBER) { r_err_str="Expected number as argument"; return ERR_PARSE_ERROR; } value=token.value; get_token(p_stream,token,line,r_err_str); if (token.type!=TK_PARENTHESIS_CLOSE) { r_err_str="Expected ')'"; return ERR_PARSE_ERROR; } return OK; } else if (id=="Resource" || id=="SubResource" || id=="ExtResource") { get_token(p_stream,token,line,r_err_str); if (token.type!=TK_PARENTHESIS_OPEN) { r_err_str="Expected '('"; return ERR_PARSE_ERROR; } if (p_res_parser && id=="Resource" && p_res_parser->func){ RES res; Error err = p_res_parser->func(p_res_parser->userdata,p_stream,res,line,r_err_str); if (err) return err; value=res; return OK; } else if (p_res_parser && id=="ExtResource" && p_res_parser->ext_func){ RES res; Error err = p_res_parser->ext_func(p_res_parser->userdata,p_stream,res,line,r_err_str); if (err) return err; value=res; return OK; } else if (p_res_parser && id=="SubResource" && p_res_parser->sub_func){ RES res; Error err = p_res_parser->sub_func(p_res_parser->userdata,p_stream,res,line,r_err_str); if (err) return err; value=res; return OK; } else { get_token(p_stream,token,line,r_err_str); if (token.type==TK_STRING) { String path=token.value; RES res = ResourceLoader::load(path); if (res.is_null()) { r_err_str="Can't load resource at path: '"+path+"'."; return ERR_PARSE_ERROR; } get_token(p_stream,token,line,r_err_str); if (token.type!=TK_PARENTHESIS_CLOSE) { r_err_str="Expected ')'"; return ERR_PARSE_ERROR; } value=res; return OK; } else { r_err_str="Expected string as argument for Resource()."; return ERR_PARSE_ERROR; } } return OK; } else if (id=="InputEvent") { get_token(p_stream,token,line,r_err_str); if (token.type!=TK_PARENTHESIS_OPEN) { r_err_str="Expected '('"; return ERR_PARSE_ERROR; } get_token(p_stream,token,line,r_err_str); if (token.type!=TK_IDENTIFIER) { r_err_str="Expected identifier"; return ERR_PARSE_ERROR; } String id = token.value; InputEvent ie; if (id=="KEY") { get_token(p_stream,token,line,r_err_str); if (token.type!=TK_COMMA) { r_err_str="Expected ','"; return ERR_PARSE_ERROR; } ie.type=InputEvent::KEY; get_token(p_stream,token,line,r_err_str); if (token.type==TK_IDENTIFIER) { String name=token.value; ie.key.scancode=find_keycode(name); } else if (token.type==TK_NUMBER) { ie.key.scancode=token.value; } else { r_err_str="Expected string or integer for keycode"; return ERR_PARSE_ERROR; } get_token(p_stream,token,line,r_err_str); if (token.type==TK_COMMA) { get_token(p_stream,token,line,r_err_str); if (token.type!=TK_IDENTIFIER) { r_err_str="Expected identifier with modifier flas"; return ERR_PARSE_ERROR; } String mods=token.value; if (mods.findn("C")!=-1) ie.key.mod.control=true; if (mods.findn("A")!=-1) ie.key.mod.alt=true; if (mods.findn("S")!=-1) ie.key.mod.shift=true; if (mods.findn("M")!=-1) ie.key.mod.meta=true; get_token(p_stream,token,line,r_err_str); if (token.type!=TK_PARENTHESIS_CLOSE) { r_err_str="Expected ')'"; return ERR_PARSE_ERROR; } } else if (token.type!=TK_PARENTHESIS_CLOSE) { r_err_str="Expected ')' or modifier flags."; return ERR_PARSE_ERROR; } } else if (id=="MBUTTON") { get_token(p_stream,token,line,r_err_str); if (token.type!=TK_COMMA) { r_err_str="Expected ','"; return ERR_PARSE_ERROR; } ie.type=InputEvent::MOUSE_BUTTON; get_token(p_stream,token,line,r_err_str); if (token.type!=TK_NUMBER) { r_err_str="Expected button index"; return ERR_PARSE_ERROR; } ie.mouse_button.button_index = token.value; get_token(p_stream,token,line,r_err_str); if (token.type!=TK_PARENTHESIS_CLOSE) { r_err_str="Expected ')'"; return ERR_PARSE_ERROR; } } else if (id=="JBUTTON") { get_token(p_stream,token,line,r_err_str); if (token.type!=TK_COMMA) { r_err_str="Expected ','"; return ERR_PARSE_ERROR; } ie.type=InputEvent::JOYSTICK_BUTTON; get_token(p_stream,token,line,r_err_str); if (token.type!=TK_NUMBER) { r_err_str="Expected button index"; return ERR_PARSE_ERROR; } ie.joy_button.button_index = token.value; get_token(p_stream,token,line,r_err_str); if (token.type!=TK_PARENTHESIS_CLOSE) { r_err_str="Expected ')'"; return ERR_PARSE_ERROR; } } else if (id=="JAXIS") { get_token(p_stream,token,line,r_err_str); if (token.type!=TK_COMMA) { r_err_str="Expected ','"; return ERR_PARSE_ERROR; } ie.type=InputEvent::JOYSTICK_MOTION; get_token(p_stream,token,line,r_err_str); if (token.type!=TK_NUMBER) { r_err_str="Expected axis index"; return ERR_PARSE_ERROR; } ie.joy_motion.axis = token.value; get_token(p_stream,token,line,r_err_str); if (token.type!=TK_COMMA) { r_err_str="Expected ',' after axis index"; return ERR_PARSE_ERROR; } get_token(p_stream,token,line,r_err_str); if (token.type!=TK_NUMBER) { r_err_str="Expected axis sign"; return ERR_PARSE_ERROR; } ie.joy_motion.axis_value = token.value; get_token(p_stream,token,line,r_err_str); if (token.type!=TK_PARENTHESIS_CLOSE) { r_err_str="Expected ')' for jaxis"; return ERR_PARSE_ERROR; } } else { r_err_str="Invalid input event type."; return ERR_PARSE_ERROR; } value=ie; return OK; } else if (id=="ByteArray") { Vector<uint8_t> args; Error err = _parse_construct<uint8_t>(p_stream,args,line,r_err_str); if (err) return err; DVector<uint8_t> arr; { int len=args.size(); arr.resize(len); DVector<uint8_t>::Write w = arr.write(); for(int i=0;i<len;i++) { w[i]=args[i]; } } value=arr; return OK; } else if (id=="IntArray") { Vector<int32_t> args; Error err = _parse_construct<int32_t>(p_stream,args,line,r_err_str); if (err) return err; DVector<int32_t> arr; { int len=args.size(); arr.resize(len); DVector<int32_t>::Write w = arr.write(); for(int i=0;i<len;i++) { w[i]=int(args[i]); } } value=arr; return OK; } else if (id=="FloatArray") { Vector<float> args; Error err = _parse_construct<float>(p_stream,args,line,r_err_str); if (err) return err; DVector<float> arr; { int len=args.size(); arr.resize(len); DVector<float>::Write w = arr.write(); for(int i=0;i<len;i++) { w[i]=args[i]; } } value=arr; return OK; } else if (id=="StringArray") { get_token(p_stream,token,line,r_err_str); if (token.type!=TK_PARENTHESIS_OPEN) { r_err_str="Expected '('"; return ERR_PARSE_ERROR; } Vector<String> cs; bool first=true; while(true) { if (!first) { get_token(p_stream,token,line,r_err_str); if (token.type==TK_COMMA) { //do none } else if (token.type==TK_PARENTHESIS_CLOSE) { break; } else { r_err_str="Expected ',' or ')'"; return ERR_PARSE_ERROR; } } get_token(p_stream,token,line,r_err_str); if (token.type!=TK_STRING) { r_err_str="Expected string"; return ERR_PARSE_ERROR; } first=false; cs.push_back(token.value); } DVector<String> arr; { int len=cs.size(); arr.resize(len); DVector<String>::Write w = arr.write(); for(int i=0;i<len;i++) { w[i]=cs[i]; } } value=arr; return OK; } else if (id=="Vector2Array") { Vector<float> args; Error err = _parse_construct<float>(p_stream,args,line,r_err_str); if (err) return err; DVector<Vector2> arr; { int len=args.size()/2; arr.resize(len); DVector<Vector2>::Write w = arr.write(); for(int i=0;i<len;i++) { w[i]=Vector2(args[i*2+0],args[i*2+1]); } } value=arr; return OK; } else if (id=="Vector3Array") { Vector<float> args; Error err = _parse_construct<float>(p_stream,args,line,r_err_str); if (err) return err; DVector<Vector3> arr; { int len=args.size()/3; arr.resize(len); DVector<Vector3>::Write w = arr.write(); for(int i=0;i<len;i++) { w[i]=Vector3(args[i*3+0],args[i*3+1],args[i*3+2]); } } value=arr; return OK; } else if (id=="ColorArray") { Vector<float> args; Error err = _parse_construct<float>(p_stream,args,line,r_err_str); if (err) return err; DVector<Color> arr; { int len=args.size()/4; arr.resize(len); DVector<Color>::Write w = arr.write(); for(int i=0;i<len;i++) { w[i]=Color(args[i*4+0],args[i*4+1],args[i*4+2],args[i*4+3]); } } value=arr; return OK; } else if (id=="key") { // compatibility with engine.cfg Vector<String> params; Error err = _parse_enginecfg(p_stream,params,line,r_err_str); if (err) return err; ERR_FAIL_COND_V(params.size()!=1 && params.size()!=2,ERR_PARSE_ERROR); int scode=0; if (params[0].is_numeric()) { scode=params[0].to_int(); if (scode < 10) { scode=KEY_0+scode; } } else scode=find_keycode(params[0]); InputEvent ie; ie.type=InputEvent::KEY; ie.key.scancode=scode; if (params.size()==2) { String mods=params[1]; if (mods.findn("C")!=-1) ie.key.mod.control=true; if (mods.findn("A")!=-1) ie.key.mod.alt=true; if (mods.findn("S")!=-1) ie.key.mod.shift=true; if (mods.findn("M")!=-1) ie.key.mod.meta=true; } value=ie; return OK; } else if (id=="mbutton") { // compatibility with engine.cfg Vector<String> params; Error err = _parse_enginecfg(p_stream,params,line,r_err_str); if (err) return err; ERR_FAIL_COND_V(params.size()!=2,ERR_PARSE_ERROR); InputEvent ie; ie.type=InputEvent::MOUSE_BUTTON; ie.device=params[0].to_int(); ie.mouse_button.button_index=params[1].to_int(); value=ie; return OK; } else if (id=="jbutton") { // compatibility with engine.cfg Vector<String> params; Error err = _parse_enginecfg(p_stream,params,line,r_err_str); if (err) return err; ERR_FAIL_COND_V(params.size()!=2,ERR_PARSE_ERROR); InputEvent ie; ie.type=InputEvent::JOYSTICK_BUTTON; ie.device=params[0].to_int(); ie.joy_button.button_index=params[1].to_int(); value=ie; return OK; } else if (id=="jaxis") { // compatibility with engine.cfg Vector<String> params; Error err = _parse_enginecfg(p_stream,params,line,r_err_str); if (err) return err; ERR_FAIL_COND_V(params.size()!=2,ERR_PARSE_ERROR); InputEvent ie; ie.type=InputEvent::JOYSTICK_MOTION; ie.device=params[0].to_int(); int axis=params[1].to_int(); ie.joy_motion.axis=axis>>1; ie.joy_motion.axis_value=axis&1?1:-1; value= ie; return OK; } else if (id=="img") { // compatibility with engine.cfg
Matrix3 Deserializer::ReadMatrix3() { float data[9]; Read(data, sizeof data); return Matrix3(data); }
CollisionPolygonEditor::CollisionPolygonEditor(EditorNode *p_editor) { editor=p_editor; undo_redo = editor->get_undo_redo(); add_child( memnew( VSeparator )); button_create = memnew( ToolButton ); add_child(button_create); button_create->connect("pressed",this,"_menu_option",varray(MODE_CREATE)); button_create->set_toggle_mode(true); button_edit = memnew( ToolButton ); add_child(button_edit); button_edit->connect("pressed",this,"_menu_option",varray(MODE_EDIT)); button_edit->set_toggle_mode(true); //add_constant_override("separation",0); #if 0 options = memnew( MenuButton ); add_child(options); options->set_area_as_parent_rect(); options->set_text("Polygon"); //options->get_popup()->add_item("Parse BBCODE",PARSE_BBCODE); options->get_popup()->connect("item_pressed", this,"_menu_option"); #endif mode = MODE_EDIT; wip_active=false; imgeom = memnew( ImmediateGeometry ); imgeom->set_transform(Transform(Matrix3(),Vector3(0,0,0.00001))); line_material = Ref<FixedMaterial>( memnew( FixedMaterial )); line_material->set_flag(Material::FLAG_UNSHADED, true); line_material->set_line_width(3.0); line_material->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true); line_material->set_fixed_flag(FixedMaterial::FLAG_USE_COLOR_ARRAY, true); line_material->set_parameter(FixedMaterial::PARAM_DIFFUSE,Color(1,1,1)); handle_material = Ref<FixedMaterial>( memnew( FixedMaterial )); handle_material->set_flag(Material::FLAG_UNSHADED, true); handle_material->set_fixed_flag(FixedMaterial::FLAG_USE_POINT_SIZE, true); handle_material->set_parameter(FixedMaterial::PARAM_DIFFUSE,Color(1,1,1)); handle_material->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true); handle_material->set_fixed_flag(FixedMaterial::FLAG_USE_COLOR_ARRAY, false); Ref<Texture> handle= SpatialEditor::get_singleton()->get_icon("Editor3DHandle","EditorIcons"); handle_material->set_point_size(handle->get_width()); handle_material->set_texture(FixedMaterial::PARAM_DIFFUSE,handle); pointsm = memnew( MeshInstance ); imgeom->add_child(pointsm); m = Ref<Mesh>( memnew( Mesh ) ); pointsm->set_mesh(m); pointsm->set_transform(Transform(Matrix3(),Vector3(0,0,0.00001))); }