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;
}
示例#3
0
/*-+-+-* 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 ;
}