void vParticleOperator_GravityRotational::Simulate( vParticle *parent ) { int vx, vy, w, t; vgui::surface()->GetFullscreenViewport( vx, vy, w, t ); Vector2D gravity_center( w * centerN.x, t * centerN.y ); Vector2D delta = parent->vecPos - gravity_center; Vector2D accel = delta * vParticle::GetRelativeScale() * GetImpulse( parent ) * amt; float speedMult = 1.0f; parent->vecVelocity += accel; parent->vecVelocity *= speedMult; }
void vParticleOperator_GravityWorld::Simulate( vParticle *parent ) { float dot_z = DotProduct( MainViewForward(), Vector( 0, 0, -1 ) ); float rotation_dir = Sign( dot_z ); int vx, vy, w, t; vgui::surface()->GetFullscreenViewport( vx, vy, w, t ); Vector screen; if ( ScreenTransform( MainViewOrigin() + Vector( 0, 0, 100 ), screen ) ) ScreenTransform( MainViewOrigin() - Vector( 0, 0, 100 ), screen ); screen *= Vector( 0.5f, -0.5f, 0 ); screen += Vector( 0.5f, 0.5f, 0 ); Vector2D gravity_center( w * screen.x, t * screen.y ); Vector2D delta = parent->vecPos - gravity_center; float screenLength = delta.NormalizeInPlace(); delta *= rotation_dir * -1.0f; Vector2D accel = delta * vParticle::GetRelativeScale() * GetImpulse( parent ) * amt; float speedMult = 1.0f; if ( rotation_dir > 0 ) { float drag = RemapValClamped( rotation_dir, 0.5f, 1, 1, 0.00001f ); ScaleByFrametime( drag ); speedMult = RemapValClamped( (screenLength/vParticle::GetRelativeScale()), 0, 1000, 0, 1 ) * (1.0f - drag) + drag; } parent->vecVelocity += accel; parent->vecVelocity *= speedMult; }
/*-+-+-* Logger *-+-+-*/ void MapStatistics::show(bool mesh, bool geom, bool error, bool param) { if(mesh) { Logger::out("Components") << num_components() << std::endl ; Logger::out("Mesh stats") << num_vertex() << " vertices, " << num_facet() << " facets, " << border_size() << "/" << num_edge() << " border edges." << sock_factor() << " sock factor." << std::endl ; } if(geom) { bounding_box() ; Logger::out("Vertex bounding box") << "[" << bbox_[0] << "," << bbox_[1] << "]x[" << bbox_[2] << "," << bbox_[3] << "]x[" << bbox_[4] << "," << bbox_[5] << "]" << std::endl ; gravity_center() ; Logger::out("Gravity center") << "(" << G_.x() << ", " << G_.y() << ", " << G_.z() << ")" << std::endl ; Logger::out("Surface area") << "area2D = " << total_area_2D() << " area3D = " << total_area_3D() << std::endl ; Logger::out("Facet area 3D") << min_facet_area_3D() << " min. " << average_facet_area_3D() << " av. " << max_facet_area_3D() << " max." << std::endl ; if(is_parameterized()) { Logger::out("Facet area 2D") << min_facet_area_2D() << " min. " << average_facet_area_2D() << " av. " << max_facet_area_2D() << " max." << std::endl ; } Logger::out("Mesh length") << "Total length 2D = " << total_length_2D() << " Total length3D = " << total_length_3D() << std::endl ; if(is_parameterized_) { Logger::out("Edge length 2D") << min_edge_length_2D() << " min. " << average_edge_length_2D() << " av. " << max_edge_length_2D() << " max." << std::endl ; } Logger::out("Edge length 3D") << min_edge_length_3D() << " min. " << average_edge_length_3D() << " av. " << max_edge_length_3D() << " max." << std::endl ; if(border_size() > 0) { Logger::out("Border count") << "Total length2D " << border_length2D() << " Total length3D " << border_length3D() << std::endl ; } else Logger::out("Border count") << "Surface is closed." << std::endl ; } if(error) { Logger::out("Errors") << num_null_edge_3D() << " null 3D edges, " << num_null_edge_2D() << " null 2D edges. " << num_flat_facet_3D() << " flat 3D facets, " << num_flat_facet_2D() << " flat 2D facets." << std::endl ; } if(param && is_parameterized()) { Logger::out("Atlas stats") << "Surfacic deformation: " << average_area_deformation() << "% av. " << max_area_deformation() << "% max." << std::endl ; Logger::out("Atlas stats") << "Error on Jacobian: " << jacobian_error() << "%." << std::endl ; Logger::out("Atlas stats") << "Angular deformation: " << average_angle_deformation() << "% av. " << max_angle_deformation() << "% max." << std::endl ; Logger::out("Atlas stats") << "Length deformation: " << average_length_deformation() << "% av. " << max_length_deformation() << "% max." << std::endl ; } else Logger::out("Atlas Stats") << "Surface is not parameterized." << std::endl ; }