#!/usr/bin/env python
"""Visual Python demo: shooting a falling object.

Note that this script can NOT be run inside ipython via the 'run' command.
You MUST run it from the command line as a standalone program.  Start by doing

chmod +x shoot.py

(or whatever you called it), and then you can run it via

./shoot.py
"""

import time
import sys

# Visual is built on top of the 'old' Numeric, so do NOT use numpy here.  We
# do a wholesale import for coding convenience, this is highly discouraged in
# larger codebases (but usually OK in very small demo scripts and interactive
# use).
from Numeric import *

import visual as V

# Geometric parameters  (all in MKS units)
theta = pi/4  # initial angle of gun
D = 20  # width ...
H = 20  # height of floor
g = -9.8  # gravity
gun_len = 2  # size of gun
arrow_len = 4  # and of arrow
v0_default = 15  # default for initial velocity if not given

# Numerical simulation parameters
dt = 0.01
# Update for all velocities under constant acceleration (gravity)
dv = # XXX use V.vector to define the change in velocity vector.  Think of the
# differential equation involved.

# Tolerance for deciding whether a collision happened
impact_distance = 0.5

# Initialize arguments
try:
    v0 = float(sys.argv[1])
except:
    v0 = v0_default
    print 'Using default v0 =',v0,'m/s.'

# Build 3d world

# Define the line of sight
sight = # XXX - use V.vector...

# The floor is just a thin box of length/width D and height 0.5:
floor = V.box(pos=(D/2.,0,0), length=D, height=0.5, width=D, color=V.color.blue)

# XXX Use V.cone for our 'arrow'
arrow = # ...
# Set the arrow's .velocity attribute correctly:
arrow.velocity = # XXX

# The target is a sphere.  Position it correctly...
target = # XXX
target.velocity = # XXX

# The 'dart gun' is just a cylinder
gun = V.cylinder(pos=(0,0,0), axis=gun_len*sight, radius=1,
                 color = V.color.green)

# Run simulation

print 'Starting simulation...'

# Put a little delay to give all the OpenGL stuff time to initialize nicely.
time.sleep(1)

while # XXX.  What should the condition be?  Objects have .y attributes for
# their y coordinate, and you can compute the magnitude of a vector using
# V.mag().

    V.rate(75)  # set the speed of the updates for visual convenience.

    # Update the object positions...

# Report to user if there was a hit or not...
if # XXX
    print 'Hit!'
else:
    print 'Miss...'

