com.badlogic.gdx.math.MathUtils Java Examples
The following examples show how to use
com.badlogic.gdx.math.MathUtils.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: Moveset.java From Unlucky with MIT License | 6 votes |
/** * Returns a Move array with 4 unique moves from a boss's movepool * * @param bossId * @return */ private Move[] getBossMoves(int bossId) { Array<Move> pool = rm.bossMoves.get(bossId); Move[] ret = new Move[4]; int index; for (int i = 0; i < ret.length; i++) { index = MathUtils.random(pool.size - 1); Move randMove = pool.get(index); Move temp = null; if (randMove.type < 2) temp = new Move(randMove.type, randMove.name, randMove.minDamage, randMove.maxDamage); else if (randMove.type == 2) temp = new Move(randMove.name, randMove.minDamage, randMove.crit); else if (randMove.type == 3) temp = new Move(randMove.name, randMove.minHeal, randMove.maxHeal, randMove.dmgReduction); ret[i] = temp; //pool.removeIndex(index); } return ret; }
Example #2
Source File: ClientSaveManager.java From Cubes with MIT License | 6 votes |
public static Save createSave(String name, String generatorID, Gamemode gamemode, String seedString) { if (name != null) name = name.trim(); if (name == null || name.isEmpty()) name = "world-" + Integer.toHexString(MathUtils.random.nextInt()); FileHandle folder = getSavesFolder(); FileHandle handle = folder.child(name); handle.mkdirs(); Compatibility.get().nomedia(handle); Save s = new Save(name, handle); SaveOptions options = new SaveOptions(); options.setWorldSeed(seedString); options.worldType = generatorID; options.worldGamemode = gamemode; s.setSaveOptions(options); return s; }
Example #3
Source File: Player.java From Radix with MIT License | 6 votes |
public int getBlockInHead(IWorld world) { int x = MathUtils.floor(getPosition().getX()); int z = MathUtils.floor(getPosition().getZ()); int y = MathUtils.floor(getPosition().getY() + HEIGHT); IChunk chunk = world.getChunk(x, z); if (chunk != null) { if (y >= world.getHeight()) return 0; try { return chunk.getBlockId(x & (world.getChunkSize() - 1), y, z & (world.getChunkSize() - 1)); } catch (BlockStorage.CoordinatesOutOfBoundsException e) { e.printStackTrace(); return 0; } } else { return 0; } }
Example #4
Source File: ExtendedColorPicker.java From vis-ui with Apache License 2.0 | 6 votes |
@Override protected void updateValuesFromCurrentColor () { int[] hsv = ColorUtils.RGBtoHSV(color); int ch = hsv[0]; int cs = hsv[1]; int cv = hsv[2]; int cr = MathUtils.round(color.r * 255.0f); int cg = MathUtils.round(color.g * 255.0f); int cb = MathUtils.round(color.b * 255.0f); int ca = MathUtils.round(color.a * 255.0f); hBar.setValue(ch); sBar.setValue(cs); vBar.setValue(cv); rBar.setValue(cr); gBar.setValue(cg); bBar.setValue(cb); aBar.setValue(ca); verticalBar.setValue(hBar.getValue()); palette.setValue(sBar.getValue(), vBar.getValue()); }
Example #5
Source File: Targeting.java From libgdx-demo-pax-britannica with MIT License | 6 votes |
/** * return a random ship of the desired type that's in range */ private static Ship getTypeInRange(Ship source, Array<Ship> ships, float range) { Array<Ship> shipsInRange = new Array<Ship>(); float range_squared = range * range; for (int i = 0; i < ships.size; i++) { Ship ship = ships.get(i); float currentDistance = source.collisionCenter.dst(ship.collisionCenter); if (ship.alive && source.id != ship.id && onScreen(ship.collisionCenter) && (currentDistance < range_squared)) { shipsInRange.add(ship); } } if (shipsInRange.size > 0) { return shipsInRange.get(MathUtils.random(0, shipsInRange.size - 1)); } else { return null; } }
Example #6
Source File: FallingObject.java From FruitCatcher with Apache License 2.0 | 6 votes |
public FallingObject(ImageProvider imageProvider, TextureRegion [] textureRegions, FallingObjectState state) { rect = new Rectangle(); rect.width = width; rect.height = height; this.textureRegions = textureRegions; this.state = state; if(state.getPosX() < 0 || state.getPosY() < 0) { rect.x = MathUtils.random(0, imageProvider.getScreenWidth()-width); rect.y = imageProvider.getScreenHeight(); } else { rect.x = state.getPosX(); rect.y = state.getPosY(); } state.setPosX((int) rect.x); state.setPosY((int) rect.y); }
Example #7
Source File: Enemy.java From ud406 with MIT License | 6 votes |
public void update(float delta) { switch (direction) { case LEFT: position.x -= Constants.ENEMY_MOVEMENT_SPEED * delta; break; case RIGHT: position.x += Constants.ENEMY_MOVEMENT_SPEED * delta; } if (position.x < platform.left) { position.x = platform.left; direction = Direction.RIGHT; } else if (position.x > platform.right) { position.x = platform.right; direction = Direction.LEFT; } final float elapsedTime = Utils.secondsSince(startTime); final float bobMultiplier = 1 + MathUtils.sin(MathUtils.PI2 * (bobOffset + elapsedTime / Constants.ENEMY_BOB_PERIOD)); position.y = platform.top + Constants.ENEMY_CENTER.y + Constants.ENEMY_BOB_AMPLITUDE * bobMultiplier; }
Example #8
Source File: ReliablePacketController.java From riiablo with Apache License 2.0 | 6 votes |
private void updateSentBandwidth() { int baseSequence = (sentPackets.getSequence() - config.sentPacketBufferSize + 1 + Packet.USHORT_MAX_VALUE) & Packet.USHORT_MAX_VALUE; int bytesSent = 0; float startTime = Float.MAX_VALUE; float finishTime = 0f; int numSamples = config.sentPacketBufferSize / 2; for (int i = 0; i < numSamples; i++) { int sequence = (baseSequence + i) & Packet.USHORT_MAX_VALUE; SentPacketData sentPacketData = sentPackets.find(sequence); if (sentPacketData == null) continue; bytesSent += sentPacketData.packetSize; startTime = Math.min(startTime, sentPacketData.time); finishTime = Math.max(finishTime, sentPacketData.time); } if (startTime != Float.MAX_VALUE && finishTime != 0f) { float sentBandwidth = bytesSent / (finishTime - startTime) * 8f / 1000f; if (MathUtils.isEqual(this.sentBandwidth, sentBandwidth, TOLERANCE)) { this.sentBandwidth += (sentBandwidth - this.sentBandwidth) * config.bandwidthSmoothingFactor; } else { this.sentBandwidth = sentBandwidth; } } }
Example #9
Source File: TypeTransformer.java From gdx-vr with Apache License 2.0 | 6 votes |
public static EyeParams transform(Viewport viewport) { int eye = viewport == VirtualReality.head.getLeftEye() ? 0 : 1; EyeParams eyeParams = new EyeParams(eye); eyeParams.getViewport().setViewport(viewport.getScreenX(), viewport.getScreenY(), MathUtils.nextPowerOfTwo(viewport.getScreenWidth()), MathUtils.nextPowerOfTwo(viewport.getScreenHeight())); float fov = ((PerspectiveCamera) viewport.getCamera()).fieldOfView; eyeParams.getFov().setLeft(fov); eyeParams.getFov().setRight(fov); eyeParams.getFov().setTop(fov); eyeParams.getFov().setBottom(fov); for (int i = 0; i < 16; i++) { eyeParams.getTransform().getEyeView()[i] = viewport.getCamera().view.val[i]; } for (int i = 0; i < 16; i++) { eyeParams.getTransform().getPerspective()[i] = viewport.getCamera().projection.val[i]; } return eyeParams; }
Example #10
Source File: Icicles.java From ud405 with MIT License | 6 votes |
public void update(float delta) { if (MathUtils.random() < delta * Constants.ICICLE_SPAWNS_PER_SECOND) { Vector2 newIciclePosition = new Vector2( MathUtils.random() * viewport.getWorldWidth(), viewport.getWorldHeight() ); Icicle newIcicle = new Icicle(newIciclePosition); icicleList.add(newIcicle); } for (Icicle icicle : icicleList) { icicle.update(delta); } icicleList.begin(); for (int i = 0; i < icicleList.size; i++) { if (icicleList.get(i).position.y < -Constants.ICICLES_HEIGHT) { // TODO: Increment count of icicles dodged icicleList.removeIndex(i); } } icicleList.end(); }
Example #11
Source File: CircularMotion.java From ud405 with MIT License | 6 votes |
@Override public void render() { viewport.apply(); Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); renderer.setProjectionMatrix(viewport.getCamera().combined); renderer.begin(ShapeType.Filled); float elapsedNanoseconds = TimeUtils.nanoTime() - initialTime; float elapsedSeconds = MathUtils.nanoToSec * elapsedNanoseconds; float elapsedPeriods = elapsedSeconds / PERIOD; float cyclePosition = elapsedPeriods % 1; float x = WORLD_SIZE / 2 + MOVEMENT_RADIUS * MathUtils.cos(MathUtils.PI2 * cyclePosition); float y = WORLD_SIZE / 2 + MOVEMENT_RADIUS * MathUtils.sin(MathUtils.PI2 * cyclePosition); renderer.circle(x, y, CIRCLE_RADIUS); // Uncomment the next line to see the sort of beautiful things you can create with simple movement // drawFancyCircles(renderer, elapsedPeriods, 20); renderer.end(); }
Example #12
Source File: EntityFactory.java From xibalba with MIT License | 6 votes |
/** * Create entrance entity. * * @param mapIndex Map to place it on * @return The entrance entity */ public Entity createEntrance(int mapIndex) { Map map = WorldManager.world.getMap(mapIndex); int cellX; int cellY; do { cellX = MathUtils.random(0, map.width - 1); cellY = MathUtils.random(0, map.height - 1); } while (WorldManager.mapHelpers.isBlocked(mapIndex, new Vector2(cellX, cellY)) && WorldManager.mapHelpers.getWallNeighbours(mapIndex, cellX, cellY) >= 4); Vector2 position = new Vector2(cellX, cellY); Entity entity = new Entity(); entity.add(new EntranceComponent()); entity.add(new PositionComponent(position)); entity.add(new VisualComponent( Main.asciiAtlas.createSprite("1203"), position )); return entity; }
Example #13
Source File: Player.java From Unlucky with MIT License | 6 votes |
/** * Increments level and recalculates max exp * Sets increase variables to display on screen * Recursively accounts for n consecutive level ups from remaining exp * * @param remainder the amount of exp left after a level up */ public void levelUp(int remainder) { level++; hpIncrease += MathUtils.random(Util.PLAYER_MIN_HP_INCREASE, Util.PLAYER_MAX_HP_INCREASE); int dmgMean = MathUtils.random(Util.PLAYER_MIN_DMG_INCREASE, Util.PLAYER_MAX_DMG_INCREASE); // deviates from mean by 0 to 2 minDmgIncrease += (dmgMean - MathUtils.random(1)); maxDmgIncrease += (dmgMean + MathUtils.random(1)); // accuracy increases by 1% every 10 levels accuracyIncrease += level % 10 == 0 ? 1 : 0; // smoveCd reduces every 10 levels if (smoveCd > 1) smoveCd -= level % 10 == 0 ? 1 : 0; int prevMaxExp = maxExp; maxExp = Util.calculateMaxExp(level, MathUtils.random(3, 5)); maxExpIncrease += (maxExp - prevMaxExp); // another level up if (remainder >= maxExp) { levelUp(remainder - maxExp); } else { exp = remainder; } }
Example #14
Source File: Biome.java From Radix with MIT License | 6 votes |
private int[] getColor(int elevation, int[][] corners) { float adjTemp = MathUtils.clamp(temperature - elevation*0.00166667f, 0, 1); float adjRainfall = MathUtils.clamp(rainfall, 0, 1) * adjTemp; getColTmp[0] = adjTemp - adjRainfall; getColTmp[1] = 1 - temperature; getColTmp[2] = rainfall; float red = 0, green = 0, blue = 0; for(int i = 0; i < 3; i++) { red += getColTmp[i] * corners[i][0/*red*/]; green += getColTmp[i] * corners[i][1/*green*/]; blue += getColTmp[i] * corners[i][2/*blue*/]; } return new int[]{ (int)MathUtils.clamp(red, 0, 255), (int)MathUtils.clamp(green, 0, 255), (int)MathUtils.clamp(blue, 0, 255) }; }
Example #15
Source File: MoveResult.java From dice-heroes with GNU General Public License v3.0 | 6 votes |
public static Array<Grid2D.Coordinate> fillAvailableCoordinates(Array<Grid2D.Coordinate> coordinates, Creature creature) { World world = creature.world; if (world == null) return coordinates; if (!creature.get(Attribute.canMove)) { coordinates.add(new Grid2D.Coordinate(creature.getX(), creature.getY())); return coordinates; } int r = MathUtils.ceil(creature.description.profession.moveRadius); float r2 = creature.description.profession.moveRadius * creature.description.profession.moveRadius; for (int x = creature.getX() - r; x <= creature.getX() + r; x++) { for (int y = creature.getY() - r; y <= creature.getY() + r; y++) { if ((x == creature.getX() && y == creature.getY() || world.canStepTo(x, y)) && tmp.set(x, y).dst2(creature.getX(), creature.getY()) <= r2) { coordinates.add(new Grid2D.Coordinate(x, y)); } } } return coordinates; }
Example #16
Source File: FallingObjectFactory.java From FruitCatcher with Apache License 2.0 | 6 votes |
public FallingObject getFruit() { TextureRegion [] textureRegions = new TextureRegion[1]; int fruitType = MathUtils.random(0, imageProvider.getFruitsCount() - 1); textureRegions[0] = imageProvider.getFruit(fruitType); boolean inSeason = FruitType.isInSeason(fruitType, season); FallingObjectState state = new FallingObjectState(); if (inSeason) { state.setType(FallingObjectType.SeasonalFruit); } else { state.setType(FallingObjectType.Fruit); } state.setIndex(fruitType); return new FallingObject(imageProvider, textureRegions, state); }
Example #17
Source File: WanderSteerer.java From GdxDemo3D with Apache License 2.0 | 6 votes |
public WanderSteerer(final SteerableBody steerableBody) { super(steerableBody); this.wanderSB = new Wander<Vector3>(steerableBody) { @Override protected SteeringAcceleration<Vector3> calculateRealSteering(SteeringAcceleration<Vector3> steering) { super.calculateRealSteering(steering); steering.linear.y = 0; // remove any vertical acceleration return steering; } }; this.wanderSB.setWanderOffset(8) // .setWanderOrientation(0) // .setWanderRadius(0.5f) // .setWanderRate(MathUtils.PI2 * 4); this.prioritySteering.add(wanderSB); }
Example #18
Source File: Enemy.java From ud406 with MIT License | 6 votes |
public void update(float delta) { switch (direction) { case LEFT: position.x -= Constants.ENEMY_MOVEMENT_SPEED * delta; break; case RIGHT: position.x += Constants.ENEMY_MOVEMENT_SPEED * delta; } if (position.x < platform.left) { position.x = platform.left; direction = Direction.RIGHT; } else if (position.x > platform.right) { position.x = platform.right; direction = Direction.LEFT; } final float elapsedTime = Utils.secondsSince(startTime); final float bobMultiplier = 1 + MathUtils.sin(MathUtils.PI2 * (bobOffset + elapsedTime / Constants.ENEMY_BOB_PERIOD)); position.y = platform.top + Constants.ENEMY_CENTER.y + Constants.ENEMY_BOB_AMPLITUDE * bobMultiplier; }
Example #19
Source File: Enemy.java From ud406 with MIT License | 6 votes |
public void update(float delta) { switch (direction) { case LEFT: position.x -= Constants.ENEMY_MOVEMENT_SPEED * delta; break; case RIGHT: position.x += Constants.ENEMY_MOVEMENT_SPEED * delta; } if (position.x < platform.left) { position.x = platform.left; direction = Direction.RIGHT; } else if (position.x > platform.right) { position.x = platform.right; direction = Direction.LEFT; } final float elapsedTime = Utils.secondsSince(startTime); final float bobMultiplier = 1 + MathUtils.sin(MathUtils.PI2 * (bobOffset + elapsedTime / Constants.ENEMY_BOB_PERIOD)); position.y = platform.top + Constants.ENEMY_CENTER.y + Constants.ENEMY_BOB_AMPLITUDE * bobMultiplier; }
Example #20
Source File: EngineF40.java From uracer-kotd with Apache License 2.0 | 6 votes |
@Override public void shiftUp () { if (UseGears) { if (gear > 0 && gear < MaxGear) { gear++; float dist = 2000; if (rpm >= dist + 1000) { // rpm -= dist; } else { // rpm = 1000; } } if (gear == 0) { gear++; // rpm = 1000; } rpm = MathUtils.clamp(rpm, 1000, 10000); } gear = MathUtils.clamp(gear, MinGear, MaxGear); }
Example #21
Source File: BlockingWindow.java From dice-heroes with GNU General Public License v3.0 | 5 votes |
@Override public void act(float delta) { super.act(delta); colorOffset += delta / colorTime; float colorListBlend = colorOffset /** (float) colors.size*/; int from = MathUtils.floor(colorListBlend); int to = MathUtils.ceil(colorListBlend); Color fromColor = colors.get(from % colors.size); Color toColor = colors.get(to % colors.size); setColor(blend(fromColor, toColor, colorListBlend - from)); scaleOffset += delta / disappearTime; setScale(1 - scaleOffset % 1f); }
Example #22
Source File: ConeLight.java From uracer-kotd with Apache License 2.0 | 5 votes |
public void setDirection(float direction) { this.direction = direction; for (int i = 0; i < rayNum; i++) { float angle = direction + coneDegree - 2f * coneDegree * i / (rayNum - 1f); final float s = sin[i] = MathUtils.sinDeg(angle); final float c = cos[i] = MathUtils.cosDeg(angle); endX[i] = distance * c; endY[i] = distance * s; } if (staticLight) staticUpdate(); }
Example #23
Source File: Icicles.java From ud405 with MIT License | 5 votes |
public void update(float delta) { // TODO: Replace hard-coded spawn rate with a constant if (MathUtils.random() < delta * 5) { // TODO: Add a new icicle at the top of the viewport at a random x position } // TODO: Update each icicle }
Example #24
Source File: ColorUtils.java From uracer-kotd with Apache License 2.0 | 5 votes |
public static Color paletteRYG (float amount, float alpha) { float greenRatio = MathUtils.clamp(amount, 0.23f, 1); float rbRange = (1 - MathUtils.clamp(greenRatio, 0.761f, 1)) / (1 - 0.761f); tmpcolor.r = 0.678f + (0.969f - 0.678f) * rbRange; tmpcolor.g = greenRatio; tmpcolor.b = 0.118f - (0.118f - 0.114f) * rbRange; tmpcolor.a = alpha; return tmpcolor; }
Example #25
Source File: Enemy.java From ud406 with MIT License | 5 votes |
public Enemy(Platform platform) { this.platform = platform; direction = Direction.RIGHT; position = new Vector2(platform.left, platform.top + Constants.ENEMY_CENTER.y); startTime = TimeUtils.nanoTime(); health = Constants.ENEMY_HEALTH; // TODO: Initialized it randomPhase = MathUtils.random(); }
Example #26
Source File: Box2dLightTest.java From box2dlights with Apache License 2.0 | 5 votes |
void initPointLights() { clearLights(); for (int i = 0; i < BALLSNUM; i++) { PointLight light = new PointLight( rayHandler, RAYS_PER_BALL, null, LIGHT_DISTANCE, 0f, 0f); light.attachToBody(balls.get(i), RADIUS / 2f, RADIUS / 2f); light.setColor( MathUtils.random(), MathUtils.random(), MathUtils.random(), 1f); lights.add(light); } }
Example #27
Source File: PlayerSmokeTrails.java From uracer-kotd with Apache License 2.0 | 5 votes |
@Override public void render (SpriteBatch batch) { if (hasPlayer) { float dfactor = player.driftState.driftStrength; float sfactor = player.carState.currSpeedFactor; fx.setLifeMul(2f); fx.setScaleMul(1f + 20f * dfactor * sfactor); float t = 0.5f * dfactor; fx.baseEmitter.getTransparency().setHighMin(t); fx.baseEmitter.getTransparency().setHighMax(t); float[] colors = fx.baseEmitter.getTint().getColors(); float v = 0.3f; colors[0] = v * dfactor; colors[1] = v * dfactor; colors[2] = v * dfactor; float r = 0.7f; float g = 0.8f; float b = 1f; if (MathUtils.randomBoolean()) { r = 0.7f; } float colorscale = 0.15f + 0.3f * dfactor; r *= colorscale; g *= colorscale; b *= colorscale; colors[0] = r; colors[1] = g; colors[2] = b; position.set(player.state().position); } fx.render(batch, position.x, position.y); }
Example #28
Source File: Scene2dSeekTest.java From gdx-ai with Apache License 2.0 | 5 votes |
@Override public void create () { super.create(); character = new SteeringActor(container.badlogicSmall, false); target = new SteeringActor(container.target); inputProcessor = new Scene2dTargetInputProcessor(target); character.setMaxLinearSpeed(250); character.setMaxLinearAcceleration(2000); final Seek<Vector2> seekSB = new Seek<Vector2>(character, target); character.setSteeringBehavior(seekSB); testTable.addActor(character); testTable.addActor(target); character.setPosition(container.stageWidth / 2, container.stageHeight / 2, Align.center); target.setPosition(MathUtils.random(container.stageWidth), MathUtils.random(container.stageHeight), Align.center); Table detailTable = new Table(container.skin); detailTable.row(); addMaxLinearAccelerationController(detailTable, character, 0, 10000, 20); detailTable.row(); addSeparator(detailTable); detailTable.row(); addMaxLinearSpeedController(detailTable, character); detailWindow = createDetailWindow(detailTable); }
Example #29
Source File: WindowParamsPersistingApplicationWrapper.java From gdx-texture-packer-gui with Apache License 2.0 | 5 votes |
private void loadWindowParams(LwjglApplicationConfiguration configuration) { FileHandle file = new FileHandle(LwjglFiles.externalPath + configuration.preferencesDirectory + "/window_params.xml"); if (!file.exists()) return; DisplayMode displayMode = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDisplayMode(); int screenWidth = displayMode.getWidth(); int screenHeight = displayMode.getHeight(); Preferences prefs = new LwjglPreferences(file); configuration.width = MathUtils.clamp(prefs.getInteger("width", configuration.width), 320, screenWidth); configuration.height = MathUtils.clamp(prefs.getInteger("height", configuration.height), 320, screenHeight); configuration.x = MathUtils.clamp(prefs.getInteger("x", configuration.x), 0, screenWidth - configuration.width); configuration.y = MathUtils.clamp(prefs.getInteger("y", configuration.y), 0, screenHeight - configuration.height); }
Example #30
Source File: RadixClient.java From Radix with MIT License | 5 votes |
private void updatePositionRotationAndroid() { if(!MathUtils.isZero(rotateTouchpad.getKnobPercentX()) || !MathUtils.isZero(rotateTouchpad.getKnobPercentY())) { float rotMult = 200 * Gdx.graphics.getDeltaTime(); player.getRotation().offset(rotateTouchpad.getKnobPercentY() * rotMult, rotateTouchpad.getKnobPercentX() * rotMult); updateSelectedBlock(); gameRenderer.calculateFrustum(); } if(!MathUtils.isZero(moveTouchpad.getKnobPercentX()) || !MathUtils.isZero(moveTouchpad.getKnobPercentY())) { float posMult = 4.5f * Gdx.graphics.getDeltaTime(); float deltaX = 0; float deltaZ = 0; float yawSine = MathUtils.sinDeg(player.getRotation().getYaw()); float yawCosine = MathUtils.cosDeg(player.getRotation().getYaw()); deltaX += yawSine * moveTouchpad.getKnobPercentY() * posMult; deltaZ += -yawCosine * moveTouchpad.getKnobPercentY() * posMult; deltaX += yawCosine * moveTouchpad.getKnobPercentX() * posMult; deltaZ += yawSine * moveTouchpad.getKnobPercentX() * posMult; if(!movementHandler.checkDeltaCollision(player, deltaX, 0, deltaZ) && !movementHandler.checkDeltaCollision(player, deltaX, 0, deltaZ)) { player.getPosition().offset(deltaX, 0, deltaZ); gameRenderer.calculateFrustum(); } } }