const VERSION = "3000.1.17"
import initApp from "./app"
import initGfx, {
Texture,
FrameBuffer,
Shader,
BatchRenderer,
} from "./gfx"
import {
Asset,
AssetBucket,
fetchArrayBuffer,
fetchJSON,
fetchText,
loadImg,
} from "./assets"
import {
sat,
vec2,
Rect,
Polygon,
Line,
Circle,
Color,
Vec2,
Mat4,
Quad,
RNG,
quad,
rgb,
hsl2rgb,
rand,
randi,
randSeed,
chance,
choose,
clamp,
lerp,
map,
mapc,
wave,
testLinePoint,
testLineLine,
testLineCircle,
testRectRect,
testRectLine,
testRectPoint,
testPolygonPoint,
testCirclePolygon,
deg2rad,
rad2deg,
} from "./math"
import easings from "./easings"
import TexPacker from "./texPacker"
import {
Registry,
Event,
EventHandler,
download,
downloadText,
downloadJSON,
downloadBlob,
uid,
isDataURL,
getFileName,
overload2,
dataURLToArrayBuffer,
EventController,
getErrorMessage,
// eslint-disable-next-line
warn,
// eslint-disable-next-line
benchmark,
// eslint-disable-next-line
comparePerf,
BinaryHeap,
runes,
} from "./utils"
import type {
GfxFont,
RenderProps,
CharTransform,
ImageSource,
FormattedText,
FormattedChar,
DrawRectOpt,
DrawLineOpt,
DrawLinesOpt,
DrawTriangleOpt,
DrawPolygonOpt,
DrawCircleOpt,
DrawEllipseOpt,
DrawUVQuadOpt,
Vertex,
BitmapFontData,
ShaderData,
AsepriteData,
LoadSpriteSrc,
LoadSpriteOpt,
SpriteAtlasData,
LoadBitmapFontOpt,
KaboomCtx,
KaboomOpt,
AudioPlay,
AudioPlayOpt,
DrawSpriteOpt,
DrawTextOpt,
TextAlign,
GameObj,
SceneName,
SceneDef,
CompList,
Comp,
Tag,
Key,
MouseButton,
PosComp,
ScaleComp,
RotateComp,
ColorComp,
OpacityComp,
Anchor,
AnchorComp,
ZComp,
FollowComp,
OffScreenCompOpt,
OffScreenComp,
AreaCompOpt,
AreaComp,
SpriteComp,
SpriteCompOpt,
SpriteAnimPlayOpt,
SpriteAnims,
TextComp,
TextCompOpt,
RectComp,
RectCompOpt,
UVQuadComp,
CircleCompOpt,
CircleComp,
OutlineComp,
TimerComp,
BodyComp,
BodyCompOpt,
Uniform,
ShaderComp,
FixedComp,
StayComp,
HealthComp,
LifespanCompOpt,
StateComp,
Debug,
KaboomPlugin,
EmptyComp,
LevelComp,
Edge,
TileComp,
TileCompOpt,
LevelOpt,
Recording,
BoomOpt,
PeditFile,
Shape,
DoubleJumpComp,
TimerController,
TweenController,
LoadFontOpt,
AgentComp,
AgentCompOpt,
PathFindOpt,
GetOpt,
Vec2Args,
NineSlice,
LerpValue,
TexFilter,
MaskComp,
Mask,
Outline,
PolygonComp,
PolygonCompOpt,
} from "./types"
import beanSpriteSrc from "./assets/bean.png"
import burpSoundSrc from "./assets/burp.mp3"
import kaSpriteSrc from "./assets/ka.png"
import boomSpriteSrc from "./assets/boom.png"
interface SpriteCurAnim {
name: string,
timer: number,
loop: boolean,
speed: number,
pingpong: boolean,
onEnd: () => void,
}
// some default charsets for loading bitmap fonts
const ASCII_CHARS = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
const DEF_ANCHOR = "topleft"
const BG_GRID_SIZE = 64
const DEF_FONT = "monospace"
const DBG_FONT = "monospace"
const DEF_TEXT_SIZE = 36
const DEF_TEXT_CACHE_SIZE = 64
const MAX_TEXT_CACHE_SIZE = 256
const FONT_ATLAS_WIDTH = 2048
const FONT_ATLAS_HEIGHT = 2048
const SPRITE_ATLAS_WIDTH = 2048
const SPRITE_ATLAS_HEIGHT = 2048
// 0.1 pixel padding to texture coordinates to prevent artifact
const UV_PAD = 0.1
const DEF_HASH_GRID_SIZE = 64
const DEF_FONT_FILTER = "linear"
const LOG_MAX = 8
const LOG_TIME = 4
const VERTEX_FORMAT = [
{ name: "a_pos", size: 2 },
{ name: "a_uv", size: 2 },
{ name: "a_color", size: 4 },
]
const STRIDE = VERTEX_FORMAT.reduce((sum, f) => sum + f.size, 0)
const MAX_BATCHED_QUAD = 2048
const MAX_BATCHED_VERTS = MAX_BATCHED_QUAD * 4 * STRIDE
const MAX_BATCHED_INDICES = MAX_BATCHED_QUAD * 6
// vertex shader template, replace {{user}} with user vertex shader code
const VERT_TEMPLATE = `
attribute vec2 a_pos;
attribute vec2 a_uv;
attribute vec4 a_color;
varying vec2 v_pos;
varying vec2 v_uv;
varying vec4 v_color;
vec4 def_vert() {
return vec4(a_pos, 0.0, 1.0);
}
{{user}}
void main() {
vec4 pos = vert(a_pos, a_uv, a_color);
v_pos = a_pos;
v_uv = a_uv;
v_color = a_color;
gl_Position = pos;
}
`
// fragment shader template, replace {{user}} with user fragment shader code
const FRAG_TEMPLATE = `
precision mediump float;
varying vec2 v_pos;
varying vec2 v_uv;
varying vec4 v_color;
uniform sampler2D u_tex;
vec4 def_frag() {
return v_color * texture2D(u_tex, v_uv);
}
{{user}}
void main() {
gl_FragColor = frag(v_pos, v_uv, v_color, u_tex);
if (gl_FragColor.a == 0.0) {
discard;
}
}
`
// default {{user}} vertex shader code
const DEF_VERT = `
vec4 vert(vec2 pos, vec2 uv, vec4 color) {
return def_vert();
}
`
// default {{user}} fragment shader code
const DEF_FRAG = `
vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) {
return def_frag();
}
`
const COMP_DESC = new Set([
"id",
"require",
])
const COMP_EVENTS = new Set([
"add",
"update",
"draw",
"destroy",
"inspect",
"drawInspect",
])
// convert anchor string to a vec2 offset
function anchorPt(orig: Anchor | Vec2): Vec2 {
switch (orig) {
case "topleft": return new Vec2(-1, -1)
case "top": return new Vec2(0, -1)
case "topright": return new Vec2(1, -1)
case "left": return new Vec2(-1, 0)
case "center": return new Vec2(0, 0)
case "right": return new Vec2(1, 0)
case "botleft": return new Vec2(-1, 1)
case "bot": return new Vec2(0, 1)
case "botright": return new Vec2(1, 1)
default: return orig
}
}
function alignPt(align: TextAlign): number {
switch (align) {
case "left": return 0
case "center": return 0.5
case "right": return 1
default: return 0
}
}
function createEmptyAudioBuffer(ctx: AudioContext) {
return ctx.createBuffer(1, 1, 44100)
}
// only exports one kaboom() which contains all the state
export default (gopt: KaboomOpt = {}): KaboomCtx => {
const root = gopt.root ?? document.body
// if root is not defined (which falls back to
) we assume user is using kaboom on a clean page, and modify to better fit a full screen canvas
if (root === document.body) {
document.body.style["width"] = "100%"
document.body.style["height"] = "100%"
document.body.style["margin"] = "0px"
document.documentElement.style["width"] = "100%"
document.documentElement.style["height"] = "100%"
}
// create a