# Translate, Rotate, Scale extension

**URL:** <https://openrndr.discourse.group/t/translate-rotate-scale-extension/212>\
**Category:** Gallery\
**Created:** [March 3, 2021, 3:26pm UTC](https://openrndr.discourse.group/t/translate-rotate-scale-extension/212 "2021-03-03T15:26:28Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![abe](https://yyz2.discourse-cdn.com/free1/user_avatar/openrndr.discourse.group/abe/32/700_2.png) [@abe](https://openrndr.discourse.group/u/abe)\
**Post date:** [March 3, 2021, 3:26pm UTC](https://openrndr.discourse.group/t/translate-rotate-scale-extension/212/1 "2021-03-03T15:26:28Z")

</div>

![TRS.mp4b](https://global.discourse-cdn.com/free1/uploads/openrndr/original/1X/4519355aaf1c1fa3b4c78950ef562f7fc50cbc5b.gif)

> **imports**
>
> import org.openrndr.Extension  
> import org.openrndr.MouseButton  
> import org.openrndr.Program  
> import org.openrndr.draw.Drawer  
> import org.openrndr.math.Matrix44  
> import org.openrndr.math.Vector2  
> import org.openrndr.math.Vector3  
> import org.openrndr.math.transforms.transform

```kotlin
/**
 * A simple OPENRNDR extension providing zoom, translation and rotation
 * by dragging the mouse with left / right buttons + scroll wheel.
 *
 * I created this because sometimes my generative designs
 * turn out too large or too small for the window.
 *
 * I think it's also a beautiful example for how much one can do
 * with very few lines of code.
 *
 * Usage: `extend(TransRotScale())`
 */

class TransRotScale : Extension {
    override var enabled: Boolean = true

    var viewMat = Matrix44.IDENTITY
    var dragStart = Vector2.ZERO

    override fun setup(program: Program) {
        program.mouse.buttonDown.listen { dragStart = it.position }
        program.mouse.dragged.listen {
            viewMat = transform {
                if (it.button == MouseButton.LEFT) {
                    translate(it.dragDisplacement)
                } else {
                    translate(dragStart)
                    rotate(Vector3.UNIT_Z, it.dragDisplacement.y)
                    translate(-dragStart)
                }
            } * viewMat
        }
        program.mouse.scrolled.listen {
            viewMat = transform {
                translate(it.position)
                scale(1.0 + 0.1 * it.rotation.y)
                translate(-it.position)
            } * viewMat
        }
    }

    override fun beforeDraw(drawer: Drawer, program: Program) {
        drawer.view *= transform
    }
}

```

[source](https://github.com/hamoid/openrndr-template/blob/master/src/main/kotlin/aBeLibs/extensions/TransRotScale.kt)
