docs: public void onDrawFrame(float frameTime)
      {
          if (!isEnabled() || (getFloat("enabled") <= 0.0f) || (owner == null)) { return; }
          float[] odir = getVec3("world_direction");
          boolean changed = false;
          Matrix4f worldmtx = owner.getTransform().getModelMatrix4f();
  
          mOldDir.x = odir[0];
          mOldDir.y = odir[1];
          mOldDir.z = odir[2];
          mNewDir.x = 0.0f;
          mNewDir.y = 0.0f;
          mNewDir.z = -1.0f;
          worldmtx.mul(mLightRot);
          worldmtx.transformDirection(mNewDir);
          mNewDir.normalize();
          if ((mOldDir.x != mNewDir.x) || (mOldDir.y != mNewDir.y) || (mOldDir.z != mNewDir.z))
          {
              changed = true;
              setVec4("world_direction", mNewDir.x, mNewDir.y, mNewDir.z, 0);
          }
          GVRShadowMap shadowMap = (GVRShadowMap) getComponent(GVRShadowMap.getComponentType());
          if ((shadowMap != null) && changed && shadowMap.isEnabled())
          {
              computePosition();
              worldmtx.setTranslation(mNewPos);
              shadowMap.setOrthoShadowMatrix(worldmtx, this);
          }
      }