Subversion Repositories DIN Is Noise

Rev

Rev 2302 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
* ball.h
* ball in Mondrian
* DIN Is Noise is released under GNU Public License 2.0
* DIN Is Noise is copyright (c) 2006-2025 Jagannathan Sampath
* For more information, please visit https://dinisnoise.org/
*/


#ifndef __ball__
#define __ball__

#include "trail.h"
#include "ball_ops.h"

struct rect;

struct ball { // a ball

  enum {NOTE = 0, NOISE};
  int trig_what; // trigger note or noise?
  static const char* trigstr [2];

  float x, y; // position

  // velocity - speed, vector, slope, slope inverse, is slope infinite?
  float V, vx, vy, vm, vm_1;
  int vm_inf;

  int auto_rotate; // velocity vector auto rotating? 0 - no, 1 - anti-clockwise, -1 - clockwise
  float dtheta; // angle to rotate ball direction

  rect* R; // box in which it is bouncing
  int select; // selected?
  int frozen; // frozen?

  float pitch_mult; // to modulate pitch
  int mod; // 0 = no modulation, < 0 = modulate down, > 0 modulate up // for visual

  float vol_mult; // to scale triggered sound volume
  float attack_time; // time for note to rise to full volume
  float decay_time; // time for note to fall silent
  enum {SET_DECAY_TIME=1, SET_ATTACK_TIME, SET_VOL_MULT};

  // bouncer = bounces, wrecker = makes slits, healer = closes slits
  int type;
  static const char* types_str [4];
  enum {BOUNCER=0, WRECKER, HEALER, INVALID};  // ball types

  // to initialise new ball
  static float recent_attack_time;
  static float recent_decay_time;
  static float recent_pitch_mult;

  int num_notes; // number of active notes triggered by this ball
  int del; // delete ball? when triggered sounds have decayed

  // operations
  turn op_turn;
  speed op_speed;
  teleport op_teleport;
  Clone op_clone;
  Transform op_transform;

  void eval_ops ();

  // visual
  trail_t trail; // trail
  float r, g, b; // color

  // log
  static int ref; // to log if we deleted all balls on exit
 
  ball (int _type = BOUNCER);
  ~ball () { --ref; }

  void init (int _type = BOUNCER);
  void set_velocity (float _x, float _y);
  void rotate_velocity (int dir);
  void calc_velocity_slope ();
  void update ();
  void set_type (int _type);
  void color_using_modulation ();
  void on_edge_hit (int e1, int e2, int cl, float& v, float xry, float yrx, float elb, float ewh, std::pair<float, float>& invl, int& eh);
  void print ();
  void clone_this (ball* C);

  // binaurality
  int binaural;
  int just;
  float sep; // in hz

};
#endif