## MashLightSet MashLightSet — A group of MashLights which can be used to affect the appearance of a MashModel. |

## Synopsis

                        MashLightSet;
    struct              MashLightSetClass;
    MashLightSet *      mash_light_set_new                  (void);
    void                mash_light_set_add_light            (MashLightSet *light_set,
                                                             MashLight *light);
    void                mash_light_set_remove_light         (MashLightSet *light_set,
                                                             MashLight *light);
    CoglHandle          mash_light_set_begin_paint          (MashLightSet *light_set,
                                                             CoglHandle material);

## Object Hierarchy

      GObject
       +----MashLightSet

## Description

MashLightSet is a toplevel object that contains a list of MashLights. The set which a light belongs to is separate from its parent actor. For a light to be useful it needs to be added to both a light set and a parent container.

The MashLightSet can only be used with actors that are specifically designed to support it. MashModel is one such actor. It can be told to use a light set with `mash_model_set_light_set()`.

The light set implements the Blinn-Phong lighting model which is the standard model used in fixed function version of OpenGL and Direct3D. The lighting calculations are performed per-vertex and then interpolated across the surface of the primitives.

Lights are positioned as normal actors by adding MashLights them to a container and moving them. The lights do not have to be in any particular position relative to the models in the hierarchy of actors, although it wouldn't make much sense if they were on different stages. The lights are subclasses of ClutterActor so they can be positioned and animated using the usual Clutter animation framework.

The lighting implementation requires GLSL support from Clutter. If the application can still work without lighting it would be worth checking for shader support by passing `COGL_FEATURE_SHADERS_GLSL` to `cogl_features_available()`.

It should be possible to extend the lighting model and implement application-specific lighting algorithms by subclassing MashLight and adding shader snippets by overriding `mash_light_generate_shader()`.

## Details

### MashLightSet

    typedef struct _MashLightSet MashLightSet;

The MashLightSet structure contains only private data.

### struct MashLightSetClass

    struct MashLightSetClass {
    };

The MashLightSetClass structure contains only private data.

### mash_light_set_new ()

    MashLightSet *      mash_light_set_new                  (void);

Constructs a new MashLightSet.

Returns : | a new MashLightSet.

### mash_light_set_add_light ()

    void                mash_light_set_add_light            (MashLightSet *light_set,
                                                             MashLight *light);

This adds a light to the set. Lights need to be added to the light set as well as to a container somewhere in the Clutter actor hierarchy in order to be useful.

`light_set` : | A MashLightSet instance
`light` : | A MashLight

### mash_light_set_remove_light ()

    void                mash_light_set_remove_light         (MashLightSet *light_set,
                                                             MashLight *light);

Removes a light from the set.

`light_set` : | A MashLightSet instance
`light` : | A MashLight

### mash_light_set_begin_paint ()

    CoglHandle          mash_light_set_begin_paint          (MashLightSet *light_set,
                                                             CoglHandle material);

This function should only be needed by custom actors that wish to use the lighting model of Mash. The function should be called every time the actor is painted. The `material` parameter is used to specify the lighting material properties. The material is not otherwise read or modified. The material properties that are used are: the emission color, the ambient color, the diffuse color, the specular color and the shininess.

The return value is a CoglProgram that should be used to paint the actor. The actor should attach this to its material using `cogl_material_set_user_program()`.

MashModels are already designed to use this function when a light set is passed to `mash_model_set_light_set()`.

`light_set` : | A MashLightSet instance
`material` : | The material that will be used to paint
Returns : | a CoglProgram to use for rendering.

Since 0.2