RES Skeleton::_get_gizmo_geometry() const { if (!GLOBAL_DEF("debug/draw_skeleton", true)) return RES(); if (bones.size()==0) return RES(); Ref<SurfaceTool> surface_tool( memnew( SurfaceTool )); Ref<FixedMaterial> mat( memnew( FixedMaterial )); mat->set_parameter( FixedMaterial::PARAM_DIFFUSE,Color(0.6,1.0,0.3,0.1) ); mat->set_line_width(4); mat->set_flag(Material::FLAG_DOUBLE_SIDED,true); mat->set_flag(Material::FLAG_UNSHADED,true); mat->set_flag(Material::FLAG_ONTOP,true); // mat->set_hint(Material::HINT_NO_DEPTH_DRAW,true); surface_tool->begin(Mesh::PRIMITIVE_LINES); surface_tool->set_material(mat); const Bone *bonesptr=&bones[0]; int len=bones.size(); for (int i=0;i<len;i++) { const Bone &b=bonesptr[i]; Transform t; if (b.parent<0) continue; Vector3 v1=(bonesptr[b.parent].pose_global * bonesptr[b.parent].rest_global_inverse).xform(bonesptr[b.parent].rest_global_inverse.affine_inverse().origin); Vector3 v2=(b.pose_global * b.rest_global_inverse).xform(b.rest_global_inverse.affine_inverse().origin); surface_tool->add_vertex(v1); surface_tool->add_vertex(v2); } return surface_tool->commit(); }
RES Portal::_get_gizmo_geometry() const { Ref<SurfaceTool> surface_tool( memnew( SurfaceTool )); Ref<FixedMaterial> mat( memnew( FixedMaterial )); mat->set_parameter( FixedMaterial::PARAM_DIFFUSE,Color(1.0,0.8,0.8,0.7) ); mat->set_line_width(4); mat->set_flag(Material::FLAG_DOUBLE_SIDED,true); mat->set_flag(Material::FLAG_UNSHADED,true); mat->set_hint(Material::HINT_NO_DEPTH_DRAW,true); surface_tool->begin(Mesh::PRIMITIVE_LINES); surface_tool->set_material(mat); Vector<Point2> shape = get_shape(); Vector2 center; for (int i=0;i<shape.size();i++) { int n=(i+1)%shape.size(); Vector<Vector3> points; surface_tool->add_vertex( Vector3( shape[i].x, shape[i].y,0 )); surface_tool->add_vertex( Vector3( shape[n].x, shape[n].y,0 )); center+=shape[i]; } if (shape.size()>0) { center/=shape.size(); Vector<Vector3> points; surface_tool->add_vertex( Vector3( center.x, center.y,0 )); surface_tool->add_vertex( Vector3( center.x, center.y,1.0 )); } return surface_tool->commit(); }
RES Camera::_get_gizmo_geometry() const { Ref<SurfaceTool> surface_tool( memnew( SurfaceTool )); Ref<FixedMaterial> mat( memnew( FixedMaterial )); mat->set_parameter( FixedMaterial::PARAM_DIFFUSE,Color(1.0,0.5,1.0,0.5) ); mat->set_line_width(4); mat->set_flag(Material::FLAG_DOUBLE_SIDED,true); mat->set_flag(Material::FLAG_UNSHADED,true); //mat->set_hint(Material::HINT_NO_DEPTH_DRAW,true); surface_tool->begin(Mesh::PRIMITIVE_LINES); surface_tool->set_material(mat); switch(mode) { case PROJECTION_PERSPECTIVE: { Vector3 side=Vector3( Math::sin(Math::deg2rad(fov)), 0, -Math::cos(Math::deg2rad(fov)) ); Vector3 nside=side; nside.x=-nside.x; Vector3 up=Vector3(0,side.x,0); #define ADD_TRIANGLE( m_a, m_b, m_c)\ {\ surface_tool->add_vertex(m_a);\ surface_tool->add_vertex(m_b);\ surface_tool->add_vertex(m_b);\ surface_tool->add_vertex(m_c);\ surface_tool->add_vertex(m_c);\ surface_tool->add_vertex(m_a);\ } ADD_TRIANGLE( Vector3(), side+up, side-up ); ADD_TRIANGLE( Vector3(), nside+up, nside-up ); ADD_TRIANGLE( Vector3(), side+up, nside+up ); ADD_TRIANGLE( Vector3(), side-up, nside-up ); side.x*=0.25; nside.x*=0.25; Vector3 tup( 0, up.y*3/2,side.z); ADD_TRIANGLE( tup, side+up, nside+up ); } break; case PROJECTION_ORTHOGONAL: { #define ADD_QUAD( m_a, m_b, m_c, m_d)\ {\ surface_tool->add_vertex(m_a);\ surface_tool->add_vertex(m_b);\ surface_tool->add_vertex(m_b);\ surface_tool->add_vertex(m_c);\ surface_tool->add_vertex(m_c);\ surface_tool->add_vertex(m_d);\ surface_tool->add_vertex(m_d);\ surface_tool->add_vertex(m_a);\ } float hsize=size*0.5; Vector3 right(hsize,0,0); Vector3 up(0,hsize,0); Vector3 back(0,0,-1.0); Vector3 front(0,0,0); ADD_QUAD( -up-right,-up+right,up+right,up-right); ADD_QUAD( -up-right+back,-up+right+back,up+right+back,up-right+back); ADD_QUAD( up+right,up+right+back,up-right+back,up-right); ADD_QUAD( -up+right,-up+right+back,-up-right+back,-up-right); right.x*=0.25; Vector3 tup( 0, up.y*3/2,back.z ); ADD_TRIANGLE( tup, right+up+back, -right+up+back ); } break; } return surface_tool->commit(); }
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); }