private void PopulatePhysicsWorld(PhysicWorldModel physicsModel, PhysicWorldController physicsController)
 {
     // TODO: read from somewhere.. right now it's ardcoded
     // TODO: do it in assets packer, then load from file
     GameObject[] quadObjects = GameObject.FindGameObjectsWithTag("quad");
     foreach (GameObject quadObj in quadObjects)
     {
         ProducePlaneFromQuad(physicsModel, physicsController, quadObj);
     }
 }
    private void UpdateShadow(GameEntityModel model, GameObject entityObject)
    {
        GameObject       shadowObj  = CharacterLoader.GetCharacterShadow(model, entityObject);
        PhysicPointModel pointModel = GameEntityController.GetPointModel(model);

        if (shadowObj == null || pointModel == null)
        {
            return;
        }

        Vector3 newShadowPosition;

        if (pointModel.collisionInpact.Y < 0)
        {
            newShadowPosition = pointModel.position.AsVector3();
        }
        else
        {
            // Raycast on physics
            WorldModel world = StateManager.state.MainModel as WorldModel;
            if (world == null)
            {
                return;
            }
            PhysicWorldModel physicsModel = StateManager.state.GetModel(world.physicsModelId) as PhysicWorldModel;
            if (physicsModel == null)
            {
                return;
            }
            PhysicWorldController physicsController = physicsModel.Controller() as PhysicWorldController;
            if (physicsController == null)
            {
                return;
            }

            PhysicPointModel entityPoint  = GameEntityController.GetPointModel(model);
            FixedVector3     intersection = physicsController.Raycast(physicsModel, entityPoint.position, FixedVector3.Down);

            newShadowPosition = intersection.AsVector3();
        }
        // TODO: coordinates conversion from a setup file
        shadowObj.transform.position      = PhysicPoint2DView.ConvertGameToViewCoordinates(newShadowPosition);
        shadowObj.transform.localPosition = new Vector3(0, shadowObj.transform.localPosition.y, 0.02f);
    }
    private void ProducePlaneFromQuad(PhysicWorldModel physicsModel, PhysicWorldController physicsController, GameObject quadObj)
    {
        MeshFilter meshFilter = quadObj.GetComponent <MeshFilter>();

        if (meshFilter == null)
        {
            return;
        }
        Vector3[] vertices = meshFilter.mesh.vertices;
        if (vertices.Length < 4)
        {
            return;
        }

        PhysicPlaneModel plane = new PhysicPlaneModel(
//			null, "debug_planes",
            quadObj.transform.TransformPoint(vertices[0]).AsFixedVetor3(),
            quadObj.transform.TransformPoint(vertices[3]).AsFixedVetor3(),
            quadObj.transform.TransformPoint(vertices[1]).AsFixedVetor3(),
            quadObj.transform.TransformPoint(vertices[2]).AsFixedVetor3()
            );

        physicsController.AddPlane(physicsModel, plane);
    }