func (r *Receiver) Simulate(gameTime gameloop.GameTime) { r.SimulationTime = gameTime deltaT := gameTime.Delta.Seconds() if !r.UIState.Impulse.ApproxEqual(glm.Vec4d{}) { regulatedImpulse := r.UIState.Impulse.Normalize().Mul(r.Constants.PlayerImpulseMomentumLimit) viewAdjustedImpulse := gtk.ToHomogVec4D(r.Player.OrientationH.Rotate(gtk.ToVec3D(regulatedImpulse))) r.Player.Velocity = r.Player.Velocity.Add(viewAdjustedImpulse) r.UIState.Impulse = glm.Vec4d{} } aggregateVelocity := r.Player.Velocity if !r.UIState.Movement.ApproxEqual(glm.Vec4d{}) { regulatedMovement := r.UIState.Movement.Normalize().Mul(r.Constants.PlayerMovementLimit) viewAdjustedMovement := gtk.ToHomogVec4D(r.Player.OrientationH.Rotate(gtk.ToVec3D(regulatedMovement))) aggregateVelocity = aggregateVelocity.Add(viewAdjustedMovement) } dp := aggregateVelocity.Mul(deltaT) for _, p := range r.Portals { portalview := p.Portalview pos := portalview.Mul4x1(r.Player.Position) v := portalview.Mul4x1(dp) if pos[2] < 0 && v[2] > 0 { t := -pos[2] / v[2] hit := pos.Add(v.Mul(t)) if math.Abs(float64(hit[0])) <= 1 && math.Abs(float64(hit[1])) <= 1 && t > 0 && t <= 1 { // fmt.Println("crossed portal", i, pos) ti := p.Transform.Inv() r.Player.Transform(ti) dp = ti.Mul4x1(dp) r.Data.Inception = r.Data.Inception.Mul4(p.Transform) break } } } p0 := r.Player.Position r.Player.Position = p0.Add(dp) //apply gravity if player is off the ground (ys==0) if r.Player.Position[1] > 1 { r.Player.Velocity[1] = r.Player.Velocity[1] + r.Constants.Gravity*deltaT } else { r.Player.Velocity[1] = 0 if p0[1] >= 1 { r.Player.Position[1] = 1 } } p := r.Player.Position translate := glm.Translate3Dd(-p[0], -p[1], -p[2]) rotation := r.Player.Orientation.Conjugate().Mat4() r.Data.Cameraview = rotation.Mul4(translate) }
func (r *Receiver) PanView(pos, delta glm.Vec2d) { theta := delta.Mul(r.Constants.PanSensitivity * r.Constants.Fov) turnV := glm.QuatRotated(theta[1], gtk.ToVec3D(r.UIState.TiltAxis)) turnH := glm.QuatRotated(-theta[0], gtk.ToVec3D(r.UIState.PanAxis)) r.UIState.Orientation = turnH.Mul(r.UIState.Orientation).Mul(turnV) }
func (r *Receiver) PanView(pos, delta glm.Vec2d) { theta := delta.Mul(r.Constants.PlayerFOV * r.Constants.PlayerPanSensitivity) turnV := glm.QuatRotated(theta[1], gtk.ToVec3D(r.Player.TiltAxis)) turnH := glm.QuatRotated(-theta[0], gtk.ToVec3D(r.Player.PanAxis)) r.Player.OrientationH = turnH.Mul(r.Player.OrientationH) r.Player.Orientation = turnH.Mul(r.Player.Orientation).Mul(turnV) r.Invalid = true }