#!BPY
"""
Name: 'Hyperbolic Paraboloid (+ basis)'
Blender: 245
Group: 'AddMesh'
"""
import BPyAddMesh
import Blender
from math import sqrt

def add_hyperbolic_paraboloid (xsize, ysize, zsize, xres, yres, alpha, beta):
    '''Generate a mesh of a hyperbolic paraboloid'''
    v = []
    f = []

    # Fill the vertices list
    x = - xsize  / 2
    while x <= xsize / 2:
        y = - ysize / 2
        while y <= ysize / 2:
            z = alpha * (x ** 2) - beta * (y ** 2)
            v.append ([x, y, z])
            y += ysize / (yres - 1)
        x += xsize / (xres - 1)

    # Add basis vertices
    y = - ysize / 2
    while y <= ysize / 2:
        v.append ([- xsize / 2, y, - zsize])
        y += ysize / (yres - 1)
    x = - xsize  / 2
    while x <= xsize / 2:
        v.append ([x, - ysize / 2, - zsize])
        x += xsize / (xres - 1)
    y = ysize / 2
    while y >= - ysize / 2:
        v.append ([xsize / 2, y, - zsize])
        y -= ysize / (yres - 1)
    x = xsize  / 2
    while x >= - xsize / 2:
        v.append ([x, ysize / 2, - zsize])
        x -= xsize / (xres - 1)

    # Fill the faces list
    for i in range (0, xres - 1):
        x = i * yres
        for j in range (0, yres - 1):
            f.append ([x + j, x + yres + j, x + yres + j + 1, x + j + 1])

    # Add basis faces
    v0 = xres * yres
    v1 = v0 + yres
    v2 = v1 + xres
    v3 = v2 + yres + xres
    for i in range (0, xres - 1):
        f.append ([v0 + i, v0 + i + 1, i + 1, i])
    for j in range (0, yres - 1):
        vj = j * xres
        f.append ([vj, vj + xres, v1 + j + 1, v1 + j])
    for i in range (0, xres - 1):
        f.append ([v0 - i - 1, v0 - i - 2, v2 + i + 1, v2 + i])
    for j in range (0, yres - 1):
        vj = j * xres + yres - 1
        f.append ([vj, vj + xres, v3 - j - 2, v3 - j - 1])

    # The bottom face
    f.append ([v3 - 1, v1, v2 - 1, v2 + xres])

    return v, f

def main ():
    xsize = Blender.Draw.Create (2.0)
    ysize = Blender.Draw.Create (2.0)
    zsize = Blender.Draw.Create (2.0)
    xres = Blender.Draw.Create (12)
    yres = Blender.Draw.Create (12)
    alpha = Blender.Draw.Create (1.0)
    beta = Blender.Draw.Create (1.0)

    params = [
                ('xsize:', xsize, 0.0, 10.0,'x size'),
                ('ysize:', ysize, 0.0, 10.0, 'y size'),
                ('zsize:', zsize, 0.0, 10.0, 'z size'),
                ('xres:', xres, 32, 500,'x resolution'),
                ('yres:', yres, 32, 500, 'y resolution'),
                ('alpha:', alpha, 0.0, 10.0, 'alpha parameter'),
                ('beta:', beta, 0.0, 10.0, 'beta parameter')
             ]


    if not Blender.Draw.PupBlock ('Add Hyperbolic Paraboloid (with basis)',
                                  params):
        return
    
    v, f = add_hyperbolic_paraboloid (xsize.val, ysize.val, zsize.val,
                                      xres.val, yres.val,
                                      alpha.val, beta.val)

    BPyAddMesh.add_mesh_simple ('Hyperbolic Paraboloid (with basis)', v, [], f)

main ()

