All Downloads are FREE. Search and download functionalities are using the official Maven repository.

main.cesium.MaterialAppearance.kt Maven / Gradle / Ivy

The newest version!
// Automatically generated - do not modify!

@file:JsModule("cesium")

@file:Suppress(
    "NON_EXTERNAL_DECLARATION_IN_INAPPROPRIATE_FILE",
)

package cesium

/**
 * An appearance for arbitrary geometry (as opposed to [EllipsoidSurfaceAppearance], for example)
 * that supports shading with materials.
 * ```
 * const primitive = new Primitive({
 *   geometryInstances : new GeometryInstance({
 *     geometry : new WallGeometry({
 *             materialSupport :  MaterialAppearance.MaterialSupport.BASIC.vertexFormat,
 *       // ...
 *     })
 *   }),
 *   appearance : new MaterialAppearance({
 *     material : Material.fromType('Color'),
 *     faceForward : true
 *   })
 *
 * });
 * ```
 * @see Online Documentation
 */
external class MaterialAppearance(options: ConstructorOptions? = definedExternally) {
    /**
     * @property [flat] When `true`, flat shading is used in the fragment shader, which means lighting is not taking into account.
     *   Default value - `false`
     * @property [faceForward] When `true`, the fragment shader flips the surface normal as needed to ensure that the normal faces the viewer to avoid dark spots.  This is useful when both sides of a geometry should be shaded like [WallGeometry].
     *   Default value - `!options.closed`
     * @property [translucent] When `true`, the geometry is expected to appear translucent so [MaterialAppearance.renderState] has alpha blending enabled.
     *   Default value - `true`
     * @property [closed] When `true`, the geometry is expected to be closed so [MaterialAppearance.renderState] has backface culling enabled.
     *   Default value - `false`
     * @property [materialSupport] The type of materials that will be supported.
     *   Default value - `MaterialAppearance.MaterialSupport.TEXTURED`
     * @property [material] The material used to determine the fragment color.
     *   Default value - [Material.ColorType]
     * @property [vertexShaderSource] Optional GLSL vertex shader source to override the default vertex shader.
     * @property [fragmentShaderSource] Optional GLSL fragment shader source to override the default fragment shader.
     * @property [renderState] Optional render state to override the default render state.
     */
    interface ConstructorOptions {
        var flat: Boolean?
        var faceForward: Boolean?
        var translucent: Boolean?
        var closed: Boolean?
        var materialSupport: MaterialSupportType?
        var material: Material?
        var vertexShaderSource: String?
        var fragmentShaderSource: String?
        var renderState: Any?
    }

    /**
     * The material used to determine the fragment color.  Unlike other [MaterialAppearance]
     * properties, this is not read-only, so an appearance's material can change on the fly.
     * @see Online Documentation
     */
    var material: Material

    /**
     * When `true`, the geometry is expected to appear translucent.
     * @see Online Documentation
     */
    var translucent: Boolean

    /**
     * The GLSL source code for the vertex shader.
     * @see Online Documentation
     */
    val vertexShaderSource: String

    /**
     * The GLSL source code for the fragment shader.  The full fragment shader
     * source is built procedurally taking into account [MaterialAppearance.material],
     * [MaterialAppearance.flat], and [MaterialAppearance.faceForward].
     * Use [MaterialAppearance.getFragmentShaderSource] to get the full source.
     * @see Online Documentation
     */
    val fragmentShaderSource: String

    /**
     * The WebGL fixed-function state to use when rendering the geometry.
     *
     * The render state can be explicitly defined when constructing a [MaterialAppearance]
     * instance, or it is set implicitly via [MaterialAppearance.translucent]
     * and [MaterialAppearance.closed].
     * @see Online Documentation
     */
    val renderState: Any

    /**
     * When `true`, the geometry is expected to be closed so
     * [MaterialAppearance.renderState] has backface culling enabled.
     * If the viewer enters the geometry, it will not be visible.
     * @see Online Documentation
     */
    val closed: Boolean

    /**
     * The type of materials supported by this instance.  This impacts the required
     * [VertexFormat] and the complexity of the vertex and fragment shaders.
     * @see Online Documentation
     */
    val materialSupport: MaterialSupportType

    /**
     * The [VertexFormat] that this appearance instance is compatible with.
     * A geometry can have more vertex attributes and still be compatible - at a
     * potential performance cost - but it can't have less.
     * @see Online Documentation
     */
    val vertexFormat: VertexFormat

    /**
     * When `true`, flat shading is used in the fragment shader,
     * which means lighting is not taking into account.
     * @see Online Documentation
     */
    val flat: Boolean

    /**
     * When `true`, the fragment shader flips the surface normal
     * as needed to ensure that the normal faces the viewer to avoid
     * dark spots.  This is useful when both sides of a geometry should be
     * shaded like [WallGeometry].
     * @see Online Documentation
     */
    val faceForward: Boolean

    /**
     * Procedurally creates the full GLSL fragment shader source.  For [MaterialAppearance],
     * this is derived from [MaterialAppearance.fragmentShaderSource], [MaterialAppearance.material],
     * [MaterialAppearance.flat], and [MaterialAppearance.faceForward].
     * @return The full GLSL fragment shader source.
     * @see Online Documentation
     */
    fun getFragmentShaderSource(): String

    /**
     * Determines if the geometry is translucent based on [MaterialAppearance.translucent] and [Material.isTranslucent].
     * @return `true` if the appearance is translucent.
     * @see Online Documentation
     */
    fun isTranslucent(): Boolean

    /**
     * Creates a render state.  This is not the final render state instance; instead,
     * it can contain a subset of render state properties identical to the render state
     * created in the context.
     * @return The render state.
     * @see Online Documentation
     */
    fun getRenderState(): Any

    interface MaterialSupportType {
        var vertexFormat: VertexFormat
        var vertexShaderSource: String
        var fragmentShaderSource: String
    }

    /**
     * Determines the type of [Material] that is supported by a
     * [MaterialAppearance] instance.  This is a trade-off between
     * flexibility (a wide array of materials) and memory/performance
     * (required vertex format and GLSL shader complexity.
     * @see Online Documentation
     */
    object MaterialSupport {
        /**
         * Only basic materials, which require just `position` and
         * `normal` vertex attributes, are supported.
         */
        val BASIC: MaterialSupportType

        /**
         * Materials with textures, which require `position`,
         * `normal`, and `st` vertex attributes,
         * are supported.  The vast majority of materials fall into this category.
         */
        val TEXTURED: MaterialSupportType

        /**
         * All materials, including those that work in tangent space, are supported.
         * This requires `position`, `normal`, `st`,
         * `tangent`, and `bitangent` vertex attributes.
         */
        val ALL: MaterialSupportType
    }

}

inline fun MaterialAppearance(
    block: MaterialAppearance.ConstructorOptions.() -> Unit,
): MaterialAppearance {
    val options: MaterialAppearance.ConstructorOptions = js("({})")
    block(options)
    return MaterialAppearance(options)
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy