Example #1
0
 void OnRenderObject()
 {
     if (m_Renderer && m_LocalMatrix != transform.localToWorldMatrix)
     {
         m_LocalMatrix = transform.localToWorldMatrix;
         LiquidSimulator.DrawObject(m_Renderer);
     }
 }
Example #2
0
    void Awake()
    {
        // Camera view
        View = GameObject.Find("View").gameObject;

        // Load some sprites to show the liquid flow directions
        LiquidFlowSprites = Resources.LoadAll <Sprite>("LiquidFlowSprites");

        // Generate our viewable grid GameObjects
        CreateGrid();

        // Initialize the liquid simulator
        LiquidSimulator = new LiquidSimulator();
        LiquidSimulator.Initialize(Cells);
    }
    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            Ray        ray = m_Camera.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (!m_IsBeginDrag)
            {
                if (Physics.Raycast(ray, out hit))
                {
                    if (hit.collider.gameObject == dragTarget)
                    {
                        if (!m_IsBeginDrag)
                        {
                            m_IsBeginDrag = true;
                            Vector3 viewPos =
                                m_Camera.transform.worldToLocalMatrix.MultiplyPoint(hit.collider.transform.position);
                            m_DragPlane      = viewPos.z;
                            m_Offset         = hit.point - hit.collider.transform.position;
                            m_DragWorldPlane = new Vector4(0, 1, 0, Vector3.Dot(Vector3.up, hit.point));
                        }
                    }
                    else if (hit.collider.gameObject == simulator.gameObject)
                    {
                        if (!m_IsBeginDrag)
                        {
                            float t = (m_SwipePlane.w -
                                       Vector3.Dot(ray.origin,
                                                   new Vector3(m_SwipePlane.x, m_SwipePlane.y, m_SwipePlane.z))) /
                                      Vector3.Dot(ray.direction,
                                                  new Vector3(m_SwipePlane.x, m_SwipePlane.y, m_SwipePlane.z));
                            Vector3   hitpos = ray.origin + ray.direction * t;
                            Matrix4x4 matrix = Matrix4x4.TRS(hitpos, Quaternion.identity, Vector3.one * swipeSize);
                            LiquidSimulator.DrawMesh(swipeMesh, matrix);
                        }
                    }
                }
            }
            else
            {
                if (m_Camera.transform.eulerAngles.x > 45)
                {
                    float t = (m_DragWorldPlane.w -
                               Vector3.Dot(ray.origin,
                                           new Vector3(m_DragWorldPlane.x, m_DragWorldPlane.y, m_DragWorldPlane.z))) /
                              Vector3.Dot(ray.direction,
                                          new Vector3(m_DragWorldPlane.x, m_DragWorldPlane.y, m_DragWorldPlane.z));
                    Vector3 hitpos = ray.origin + ray.direction * t;

                    dragTarget.transform.position = hitpos - m_Offset;
                }
                else
                {
                    float tan    = Mathf.Tan(m_Camera.fieldOfView * 0.5f * Mathf.Deg2Rad);
                    float height = m_DragPlane * tan;
                    float width  = height * m_Camera.aspect;

                    float   x       = (Input.mousePosition.x / Screen.width) * 2 - 1;
                    float   y       = (Input.mousePosition.y / Screen.height) * 2 - 1;
                    Vector3 viewPos = new Vector3(x * width, y * height, m_DragPlane);
                    Vector3 pos     = m_Camera.transform.localToWorldMatrix.MultiplyPoint(viewPos);
                    dragTarget.transform.position = pos - m_Offset;
                }
            }
        }

        if (Input.GetMouseButtonUp(0))
        {
            m_IsBeginDrag = false;
        }
    }