commit
51752f95f9
File diff suppressed because it is too large
Load Diff
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil;
|
||||
|
||||
import java.lang.reflect.Array;
|
||||
@ -611,8 +611,7 @@ public class ArrayUtil {
|
||||
int end = offset + length;
|
||||
if (end > arrayLength || offset < 0)
|
||||
throw new IllegalArgumentException(
|
||||
"Array contains [0; " + arrayLength + "), requested [" + offset + "; " + end + ")"
|
||||
);
|
||||
"Array contains [0; " + arrayLength + "), requested [" + offset + "; " + end + ")");
|
||||
|
||||
return length;
|
||||
}
|
||||
@ -628,8 +627,7 @@ public class ArrayUtil {
|
||||
|
||||
if (end > arrayLength || start < 0)
|
||||
throw new IllegalArgumentException(
|
||||
"Array contains [0; " + arrayLength + "), requested [" + start + "; " + end + ")"
|
||||
);
|
||||
"Array contains [0; " + arrayLength + "), requested [" + start + "; " + end + ")");
|
||||
|
||||
return end;
|
||||
}
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil;
|
||||
|
||||
import java.io.OutputStream;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil;
|
||||
|
||||
import java.util.HashMap;
|
||||
@ -30,18 +30,8 @@ public class PrimitiveUtil {
|
||||
private static final Map<Class<?>, Object> PRIMITIVE_TO_NULL = new HashMap<>();
|
||||
|
||||
static {
|
||||
for (
|
||||
Class<?> boxed : new Class<?>[] {
|
||||
Boolean.class,
|
||||
Byte.class,
|
||||
Short.class,
|
||||
Character.class,
|
||||
Integer.class,
|
||||
Long.class,
|
||||
Float.class,
|
||||
Double.class
|
||||
}
|
||||
) {
|
||||
for (Class<?> boxed : new Class<?>[] { Boolean.class, Byte.class, Short.class, Character.class, Integer.class,
|
||||
Long.class, Float.class, Double.class }) {
|
||||
try {
|
||||
PRIMITIVE_TO_BOXED.put((Class<?>) boxed.getField("TYPE").get(null), boxed);
|
||||
} catch (Exception e) {
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil;
|
||||
|
||||
import java.util.function.*;
|
||||
@ -40,8 +40,7 @@ import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* Contains static methods to create {@link Stream Streams} that synchronize
|
||||
* their
|
||||
* <a href=
|
||||
* their <a href=
|
||||
* "https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps">
|
||||
* terminal operations</a> on a given monitor.
|
||||
*
|
||||
@ -50,7 +49,7 @@ import java.util.stream.Stream;
|
||||
*/
|
||||
|
||||
// SonarLint: "Stream.peek" should be used with caution (java:S3864)
|
||||
// We are implementing Stream, so peek() is required.
|
||||
// We are implementing Stream, so peek() is required.
|
||||
@SuppressWarnings("squid:S3864")
|
||||
|
||||
public class SyncStreams {
|
||||
@ -1070,21 +1069,18 @@ public class SyncStreams {
|
||||
}
|
||||
|
||||
/**
|
||||
* Wraps the given {@link Stream} to make all
|
||||
* <a href=
|
||||
* Wraps the given {@link Stream} to make all <a href=
|
||||
* "https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps">
|
||||
* terminal operations</a> acquire the provided monitor's lock before
|
||||
* execution. Intermediate operations
|
||||
* return streams that are also synchronized on the same object. The created
|
||||
* stream will behave identically
|
||||
* to the provided stream in all other aspects. Use this to synchronize
|
||||
* access to stream's source.
|
||||
* execution. Intermediate operations return streams that are also
|
||||
* synchronized on the same object. The created stream will behave
|
||||
* identically to the provided stream in all other aspects. Use this to
|
||||
* synchronize access to stream's source.
|
||||
* <p>
|
||||
* <i>The returned {@code Stream}'s {@link Stream#iterator() iterator()} and
|
||||
* {@link Stream#spliterator()
|
||||
* spliterator()} methods return regular non-synchronized iterators and
|
||||
* spliterators respectively</i>. It
|
||||
* is the user's responsibility to avoid concurrency issues:
|
||||
* {@link Stream#spliterator() spliterator()} methods return regular
|
||||
* non-synchronized iterators and spliterators respectively</i>. It is the
|
||||
* user's responsibility to avoid concurrency issues:
|
||||
*
|
||||
* <pre>
|
||||
* synchronized (stream.getMonitor()) {
|
||||
@ -1103,14 +1099,17 @@ public class SyncStreams {
|
||||
* stream.forEach(System.out::println); // Should never throw a ConcurrentModificationException
|
||||
* </pre>
|
||||
*
|
||||
* @param <T> the class of objects in the Stream
|
||||
* @param stream the stream to wrap.
|
||||
* @param monitor the object that the stream will use for synchronization.
|
||||
* When {@code null}, the stream
|
||||
* will synchronize on itself.
|
||||
* @param <T>
|
||||
* the class of objects in the Stream
|
||||
* @param stream
|
||||
* the stream to wrap.
|
||||
* @param monitor
|
||||
* the object that the stream will use for synchronization. When
|
||||
* {@code null}, the stream will synchronize on itself.
|
||||
* @return a {@link SyncStream SyncStream<T>} synchronized on
|
||||
* {@code monitor} and backed by {@code stream}.
|
||||
* @throws NullPointerException if {@code stream == null}.
|
||||
* @throws NullPointerException
|
||||
* if {@code stream == null}.
|
||||
*/
|
||||
public static <T> SyncStream<T> synchronizedStream(Stream<T> stream, Object monitor) {
|
||||
Objects.requireNonNull(stream, "stream cannot be null");
|
||||
@ -1118,22 +1117,19 @@ public class SyncStreams {
|
||||
}
|
||||
|
||||
/**
|
||||
* Wraps the given {@link IntStream} to make all
|
||||
* <a href=
|
||||
* Wraps the given {@link IntStream} to make all <a href=
|
||||
* "https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps">
|
||||
* terminal operations</a> acquire the provided monitor's lock before
|
||||
* execution. Intermediate operations
|
||||
* return streams that are also synchronized on the same object. The created
|
||||
* stream will behave identically
|
||||
* to the provided stream in all other aspects. Use this to synchronize
|
||||
* access to stream's source.
|
||||
* execution. Intermediate operations return streams that are also
|
||||
* synchronized on the same object. The created stream will behave
|
||||
* identically to the provided stream in all other aspects. Use this to
|
||||
* synchronize access to stream's source.
|
||||
* <p>
|
||||
* <i>The returned {@code IntStream}'s {@link IntStream#iterator()
|
||||
* iterator()} and
|
||||
* {@link IntStream#spliterator() spliterator()} methods return regular
|
||||
* non-synchronized iterators and
|
||||
* spliterators respectively</i>. It is the user's responsibility to avoid
|
||||
* concurrency issues:
|
||||
* iterator()} and {@link IntStream#spliterator() spliterator()} methods
|
||||
* return regular non-synchronized iterators and spliterators
|
||||
* respectively</i>. It is the user's responsibility to avoid concurrency
|
||||
* issues:
|
||||
*
|
||||
* <pre>
|
||||
* synchronized (stream.getMonitor()) {
|
||||
@ -1152,13 +1148,15 @@ public class SyncStreams {
|
||||
* stream.forEach(System.out::println); // Should never throw a ConcurrentModificationException
|
||||
* </pre>
|
||||
*
|
||||
* @param stream the stream to wrap.
|
||||
* @param monitor the object that the stream will use for synchronization.
|
||||
* When {@code null}, the stream
|
||||
* will synchronize on itself.
|
||||
* @param stream
|
||||
* the stream to wrap.
|
||||
* @param monitor
|
||||
* the object that the stream will use for synchronization. When
|
||||
* {@code null}, the stream will synchronize on itself.
|
||||
* @return a {@link SyncIntStream} synchronized on {@code monitor} and
|
||||
* backed by {@code stream}.
|
||||
* @throws NullPointerException if {@code stream == null}.
|
||||
* @throws NullPointerException
|
||||
* if {@code stream == null}.
|
||||
*/
|
||||
public static SyncIntStream synchronizedStream(IntStream stream, Object monitor) {
|
||||
Objects.requireNonNull(stream, "stream cannot be null");
|
||||
@ -1166,22 +1164,19 @@ public class SyncStreams {
|
||||
}
|
||||
|
||||
/**
|
||||
* Wraps the given {@link LongStream} to make all
|
||||
* <a href=
|
||||
* Wraps the given {@link LongStream} to make all <a href=
|
||||
* "https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps">
|
||||
* terminal operations</a> acquire the provided monitor's lock before
|
||||
* execution. Intermediate operations
|
||||
* return streams that are also synchronized on the same object. The created
|
||||
* stream will behave identically
|
||||
* to the provided stream in all other aspects. Use this to synchronize
|
||||
* access to stream's source.
|
||||
* execution. Intermediate operations return streams that are also
|
||||
* synchronized on the same object. The created stream will behave
|
||||
* identically to the provided stream in all other aspects. Use this to
|
||||
* synchronize access to stream's source.
|
||||
* <p>
|
||||
* <i>The returned {@code LongStream}'s {@link LongStream#iterator()
|
||||
* iterator()} and
|
||||
* {@link LongStream#spliterator() spliterator()} methods return regular
|
||||
* non-synchronized iterators and
|
||||
* spliterators respectively</i>. It is the user's responsibility to avoid
|
||||
* concurrency issues:
|
||||
* iterator()} and {@link LongStream#spliterator() spliterator()} methods
|
||||
* return regular non-synchronized iterators and spliterators
|
||||
* respectively</i>. It is the user's responsibility to avoid concurrency
|
||||
* issues:
|
||||
*
|
||||
* <pre>
|
||||
* synchronized (stream.getMonitor()) {
|
||||
@ -1200,13 +1195,15 @@ public class SyncStreams {
|
||||
* stream.forEach(System.out::println); // Should never throw a ConcurrentModificationException
|
||||
* </pre>
|
||||
*
|
||||
* @param stream the stream to wrap.
|
||||
* @param monitor the object that the stream will use for synchronization.
|
||||
* When {@code null}, the stream
|
||||
* will synchronize on itself.
|
||||
* @param stream
|
||||
* the stream to wrap.
|
||||
* @param monitor
|
||||
* the object that the stream will use for synchronization. When
|
||||
* {@code null}, the stream will synchronize on itself.
|
||||
* @return a {@link SyncLongStream} synchronized on {@code monitor} and
|
||||
* backed by {@code stream}.
|
||||
* @throws NullPointerException if {@code stream == null}.
|
||||
* @throws NullPointerException
|
||||
* if {@code stream == null}.
|
||||
*/
|
||||
public static SyncLongStream synchronizedStream(LongStream stream, Object monitor) {
|
||||
Objects.requireNonNull(stream, "stream cannot be null");
|
||||
@ -1214,22 +1211,19 @@ public class SyncStreams {
|
||||
}
|
||||
|
||||
/**
|
||||
* Wraps the given {@link DoubleStream} to make all
|
||||
* <a href=
|
||||
* Wraps the given {@link DoubleStream} to make all <a href=
|
||||
* "https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps">
|
||||
* terminal operations</a> acquire the provided monitor's lock before
|
||||
* execution. Intermediate operations
|
||||
* return streams that are also synchronized on the same object. The created
|
||||
* stream will behave identically
|
||||
* to the provided stream in all other aspects. Use this to synchronize
|
||||
* access to stream's source.
|
||||
* execution. Intermediate operations return streams that are also
|
||||
* synchronized on the same object. The created stream will behave
|
||||
* identically to the provided stream in all other aspects. Use this to
|
||||
* synchronize access to stream's source.
|
||||
* <p>
|
||||
* <i>The returned {@code DoubleStream}'s {@link DoubleStream#iterator()
|
||||
* iterator()} and
|
||||
* {@link DoubleStream#spliterator() spliterator()} methods return regular
|
||||
* non-synchronized iterators and
|
||||
* spliterators respectively</i>. It is the user's responsibility to avoid
|
||||
* concurrency issues:
|
||||
* iterator()} and {@link DoubleStream#spliterator() spliterator()} methods
|
||||
* return regular non-synchronized iterators and spliterators
|
||||
* respectively</i>. It is the user's responsibility to avoid concurrency
|
||||
* issues:
|
||||
*
|
||||
* <pre>
|
||||
* synchronized (stream.getMonitor()) {
|
||||
@ -1248,13 +1242,15 @@ public class SyncStreams {
|
||||
* stream.forEach(System.out::println); // Should never throw a ConcurrentModificationException
|
||||
* </pre>
|
||||
*
|
||||
* @param stream the stream to wrap.
|
||||
* @param monitor the object that the stream will use for synchronization.
|
||||
* When {@code null}, the stream
|
||||
* will synchronize on itself.
|
||||
* @param stream
|
||||
* the stream to wrap.
|
||||
* @param monitor
|
||||
* the object that the stream will use for synchronization. When
|
||||
* {@code null}, the stream will synchronize on itself.
|
||||
* @return a {@link SyncDoubleStream} synchronized on {@code monitor} and
|
||||
* backed by {@code stream}.
|
||||
* @throws NullPointerException if {@code stream == null}.
|
||||
* @throws NullPointerException
|
||||
* if {@code stream == null}.
|
||||
*/
|
||||
public static SyncDoubleStream synchronizedStream(DoubleStream stream, Object monitor) {
|
||||
Objects.requireNonNull(stream, "stream cannot be null");
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil;
|
||||
|
||||
public class SyntaxException extends Exception {
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars;
|
||||
|
||||
import java.text.CharacterIterator;
|
||||
@ -108,7 +108,7 @@ public class CharArrayIterator implements CharacterIterator {
|
||||
return pos;
|
||||
}
|
||||
|
||||
// @SuppressWarnings("all") Just STFU, this _is_ terrific
|
||||
// @SuppressWarnings("all") Just STFU, this _is_ terrific
|
||||
|
||||
// SonarLint: "clone" should not be overridden (java:S2975)
|
||||
// And I wouldn't have done that if only CharacterIterator had not required
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars;
|
||||
|
||||
import java.util.function.IntConsumer;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars;
|
||||
|
||||
import java.util.Objects;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars;
|
||||
|
||||
import java.util.function.IntSupplier;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars;
|
||||
|
||||
public class EscapeException extends Exception {
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars;
|
||||
|
||||
import java.text.CharacterIterator;
|
||||
@ -103,14 +103,8 @@ public class Escaper {
|
||||
|
||||
}
|
||||
|
||||
public static final Escaper JAVA = new Escaper(
|
||||
'\\',
|
||||
'u',
|
||||
"tbnrf'\"".toCharArray(),
|
||||
"\t\b\n\r\f\'\"".toCharArray(),
|
||||
true,
|
||||
true
|
||||
);
|
||||
public static final Escaper JAVA = new Escaper('\\', 'u', "tbnrf'\"".toCharArray(), "\t\b\n\r\f\'\"".toCharArray(),
|
||||
true, true);
|
||||
|
||||
private final char escapeChar;
|
||||
private final char unicodeEscapeChar;
|
||||
@ -120,14 +114,8 @@ public class Escaper {
|
||||
private final boolean preferUnicode;
|
||||
private final boolean strict;
|
||||
|
||||
protected Escaper(
|
||||
char escapeChar,
|
||||
char unicodeEscapeChar,
|
||||
char[] safes,
|
||||
char[] unsafes,
|
||||
boolean preferUnicode,
|
||||
boolean strict
|
||||
) {
|
||||
protected Escaper(char escapeChar, char unicodeEscapeChar, char[] safes, char[] unsafes, boolean preferUnicode,
|
||||
boolean strict) {
|
||||
this.escapeChar = escapeChar;
|
||||
this.unicodeEscapeChar = unicodeEscapeChar;
|
||||
this.safes = safes;
|
||||
@ -152,8 +140,7 @@ public class Escaper {
|
||||
for (char c : unsafes) {
|
||||
if (c == escapeChar)
|
||||
throw new IllegalArgumentException(
|
||||
"Unsafe characters contain escape chatacter (escape character is escaped automatically)"
|
||||
);
|
||||
"Unsafe characters contain escape chatacter (escape character is escaped automatically)");
|
||||
if (c == unicodeEscapeChar)
|
||||
throw new IllegalArgumentException("Unsafe characters contain Unicode escape chatacter");
|
||||
}
|
||||
@ -173,11 +160,7 @@ public class Escaper {
|
||||
end = Integer.MAX_VALUE;
|
||||
else
|
||||
end = src.getPosition() + length;
|
||||
while (
|
||||
src.has() &&
|
||||
src.getPosition() < end &&
|
||||
(until == null || !until.test(src.current()))
|
||||
)
|
||||
while (src.has() && src.getPosition() < end && (until == null || !until.test(src.current())))
|
||||
escape(src.consume(), output);
|
||||
}
|
||||
|
||||
@ -225,11 +208,7 @@ public class Escaper {
|
||||
|
||||
int result = 0;
|
||||
|
||||
while (
|
||||
src.has() &&
|
||||
src.getPosition() < end &&
|
||||
(until == null || !until.test(src.current()))
|
||||
) {
|
||||
while (src.has() && src.getPosition() < end && (until == null || !until.test(src.current()))) {
|
||||
result += getEscapedLength(src.consume());
|
||||
}
|
||||
|
||||
@ -257,11 +236,7 @@ public class Escaper {
|
||||
end = Integer.MAX_VALUE;
|
||||
else
|
||||
end = src.getPosition() + length;
|
||||
while (
|
||||
src.has() &&
|
||||
src.getPosition() < end &&
|
||||
(until == null || !until.test(src.current()))
|
||||
) {
|
||||
while (src.has() && src.getPosition() < end && (until == null || !until.test(src.current()))) {
|
||||
output.accept(unescapeOneSequence(src));
|
||||
}
|
||||
}
|
||||
@ -282,10 +257,8 @@ public class Escaper {
|
||||
|
||||
if (src.current() == unicodeEscapeChar) {
|
||||
src.next();
|
||||
return (char) (hexValue(src.consume()) << (4 * 3) |
|
||||
hexValue(src.consume()) << (4 * 2) |
|
||||
hexValue(src.consume()) << (4 * 1) |
|
||||
hexValue(src.consume()) << (4 * 0));
|
||||
return (char) (hexValue(src.consume()) << (4 * 3) | hexValue(src.consume()) << (4 * 2)
|
||||
| hexValue(src.consume()) << (4 * 1) | hexValue(src.consume()) << (4 * 0));
|
||||
}
|
||||
|
||||
int index = ArrayUtil.firstIndexOf(safes, src.current());
|
||||
@ -315,11 +288,7 @@ public class Escaper {
|
||||
|
||||
int result = 0;
|
||||
|
||||
while (
|
||||
src.has() &&
|
||||
src.getPosition() < end &&
|
||||
(until == null || !until.test(src.current()))
|
||||
) {
|
||||
while (src.has() && src.getPosition() < end && (until == null || !until.test(src.current()))) {
|
||||
skipOneSequence(src);
|
||||
result++;
|
||||
}
|
||||
@ -328,11 +297,7 @@ public class Escaper {
|
||||
}
|
||||
|
||||
public void skipOneSequence(CharReader src) {
|
||||
if (
|
||||
src.current() == escapeChar
|
||||
&&
|
||||
src.next() == unicodeEscapeChar
|
||||
) {
|
||||
if (src.current() == escapeChar && src.next() == unicodeEscapeChar) {
|
||||
src.advance(4);
|
||||
}
|
||||
src.next();
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars;
|
||||
|
||||
import java.text.CharacterIterator;
|
||||
@ -86,7 +86,7 @@ public class FancyCharacterIterator implements CharacterIterator {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
// @SuppressWarnings("all") Just STFU, this _is_ terrific
|
||||
// @SuppressWarnings("all") Just STFU, this _is_ terrific
|
||||
|
||||
// SonarLint: "clone" should not be overridden (java:S2975)
|
||||
// And I wouldn't have done that if only CharacterIterator had not required
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars;
|
||||
|
||||
public class IndentedStringBuilder {
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars;
|
||||
|
||||
import java.io.IOException;
|
||||
@ -41,13 +41,8 @@ public class StringUtil {
|
||||
private static final String EMPTY_PLACEHOLDER = "[empty]";
|
||||
private static final String DEFAULT_SEPARATOR = "; ";
|
||||
|
||||
public static <T> String arrayToString(
|
||||
T[] array,
|
||||
String separator,
|
||||
String empty,
|
||||
String nullPlaceholder,
|
||||
String nullArray
|
||||
) {
|
||||
public static <T> String arrayToString(T[] array, String separator, String empty, String nullPlaceholder,
|
||||
String nullArray) {
|
||||
|
||||
if (separator == null) {
|
||||
throw new IllegalArgumentException(new NullPointerException());
|
||||
@ -79,13 +74,8 @@ public class StringUtil {
|
||||
return arrayToString(array, DEFAULT_SEPARATOR);
|
||||
}
|
||||
|
||||
public static String iteratorToString(
|
||||
Iterator<?> iterator,
|
||||
String separator,
|
||||
String empty,
|
||||
String nullPlaceholder,
|
||||
String nullIterator
|
||||
) {
|
||||
public static String iteratorToString(Iterator<?> iterator, String separator, String empty, String nullPlaceholder,
|
||||
String nullIterator) {
|
||||
|
||||
if (separator == null) {
|
||||
throw new IllegalArgumentException(new NullPointerException());
|
||||
@ -119,13 +109,8 @@ public class StringUtil {
|
||||
return iteratorToString(iterator, DEFAULT_SEPARATOR);
|
||||
}
|
||||
|
||||
public static String iterableToString(
|
||||
Iterable<?> iterable,
|
||||
String separator,
|
||||
String empty,
|
||||
String nullPlaceholder,
|
||||
String nullIterable
|
||||
) {
|
||||
public static String iterableToString(Iterable<?> iterable, String separator, String empty, String nullPlaceholder,
|
||||
String nullIterable) {
|
||||
|
||||
if (separator == null) {
|
||||
throw new IllegalArgumentException(new NullPointerException());
|
||||
@ -146,14 +131,8 @@ public class StringUtil {
|
||||
return iterableToString(iterable, DEFAULT_SEPARATOR);
|
||||
}
|
||||
|
||||
public static <T> String supplierToString(
|
||||
IntFunction<T> supplier,
|
||||
int length,
|
||||
String separator,
|
||||
String empty,
|
||||
String nullPlaceholder,
|
||||
String nullSupplier
|
||||
) {
|
||||
public static <T> String supplierToString(IntFunction<T> supplier, int length, String separator, String empty,
|
||||
String nullPlaceholder, String nullSupplier) {
|
||||
|
||||
if (separator == null)
|
||||
throw new IllegalArgumentException(new NullPointerException());
|
||||
@ -163,28 +142,15 @@ public class StringUtil {
|
||||
return empty;
|
||||
|
||||
if (length > 0) {
|
||||
return supplierToStringExactly(
|
||||
supplier,
|
||||
length,
|
||||
separator,
|
||||
nullPlaceholder
|
||||
);
|
||||
return supplierToStringExactly(supplier, length, separator, nullPlaceholder);
|
||||
} else {
|
||||
return supplierToStringUntilNull(
|
||||
supplier,
|
||||
separator,
|
||||
empty
|
||||
);
|
||||
return supplierToStringUntilNull(supplier, separator, empty);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static <T> String supplierToStringExactly(
|
||||
IntFunction<T> supplier,
|
||||
int length,
|
||||
String separator,
|
||||
String nullPlaceholder
|
||||
) {
|
||||
private static <T> String supplierToStringExactly(IntFunction<T> supplier, int length, String separator,
|
||||
String nullPlaceholder) {
|
||||
T element = supplier.apply(0);
|
||||
|
||||
StringBuilder sb = new StringBuilder(element == null ? nullPlaceholder : element.toString());
|
||||
@ -198,11 +164,7 @@ public class StringUtil {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private static <T> String supplierToStringUntilNull(
|
||||
IntFunction<T> supplier,
|
||||
String separator,
|
||||
String empty
|
||||
) {
|
||||
private static <T> String supplierToStringUntilNull(IntFunction<T> supplier, String separator, String empty) {
|
||||
T element = supplier.apply(0);
|
||||
|
||||
if (element == null) {
|
||||
@ -366,11 +328,7 @@ public class StringUtil {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
charLoop: for (char c : src.toCharArray()) {
|
||||
if (
|
||||
(resultIndex + 1) < arrayLength
|
||||
&&
|
||||
test.test(c)
|
||||
) {
|
||||
if ((resultIndex + 1) < arrayLength && test.test(c)) {
|
||||
result[resultIndex] = resetStringBuilder(sb);
|
||||
++resultIndex;
|
||||
continue charLoop;
|
||||
@ -389,17 +347,17 @@ public class StringUtil {
|
||||
* index.
|
||||
* <p>
|
||||
* Indices {@code 0} and {@code src.length() - 1} produce {@code str}
|
||||
* excluding
|
||||
* the specified character and {@code ""}.
|
||||
* excluding the specified character and {@code ""}.
|
||||
* <p>
|
||||
*
|
||||
* @param src the String to split
|
||||
* @param at index to split at
|
||||
* @throws IllegalArgumentException if the index is out of bounds for
|
||||
* {@code src}
|
||||
* @param src
|
||||
* the String to split
|
||||
* @param at
|
||||
* index to split at
|
||||
* @throws IllegalArgumentException
|
||||
* if the index is out of bounds for {@code src}
|
||||
* @return an array containing the substrings, in order of encounter in
|
||||
* {@code src}.
|
||||
* Its length is always 2.
|
||||
* {@code src}. Its length is always 2.
|
||||
*/
|
||||
public static String[] splitAt(String src, int at) {
|
||||
Objects.requireNonNull(src, "src");
|
||||
@ -416,10 +374,7 @@ public class StringUtil {
|
||||
return new String[] { src.substring(0, src.length() - 1), "" };
|
||||
}
|
||||
|
||||
return new String[] {
|
||||
src.substring(0, at),
|
||||
src.substring(at + 1)
|
||||
};
|
||||
return new String[] { src.substring(0, at), src.substring(at + 1) };
|
||||
}
|
||||
|
||||
/**
|
||||
@ -427,8 +382,7 @@ public class StringUtil {
|
||||
* indices.
|
||||
* <p>
|
||||
* Indices {@code 0} and {@code src.length() - 1} produce extra zero-length
|
||||
* outputs.
|
||||
* Duplicate indices produce extra zero-length outputs.
|
||||
* outputs. Duplicate indices produce extra zero-length outputs.
|
||||
* <p>
|
||||
* Examples:
|
||||
*
|
||||
@ -439,13 +393,14 @@ public class StringUtil {
|
||||
* splitAt("a.b", 1, 1, 1) -> {"a", "", "", "b"}
|
||||
* </pre>
|
||||
*
|
||||
* @param src the String to split
|
||||
* @param at indices to split at, in any order
|
||||
* @throws IllegalArgumentException if some index is out of bounds for
|
||||
* {@code src}
|
||||
* @param src
|
||||
* the String to split
|
||||
* @param at
|
||||
* indices to split at, in any order
|
||||
* @throws IllegalArgumentException
|
||||
* if some index is out of bounds for {@code src}
|
||||
* @return an array containing the substrings, in order of encounter in
|
||||
* {@code src}.
|
||||
* Its length is always {@code at.length + 1}.
|
||||
* {@code src}. Its length is always {@code at.length + 1}.
|
||||
*/
|
||||
public static String[] splitAt(String src, int... at) {
|
||||
Objects.requireNonNull(src, "src");
|
||||
@ -553,10 +508,8 @@ public class StringUtil {
|
||||
}
|
||||
|
||||
if (endPos < beginPos) {
|
||||
throw new IllegalArgumentException(
|
||||
"endPos must be greater than or equal to beginPos (endPos="
|
||||
+ endPos + ", beginPos=" + beginPos + ")"
|
||||
);
|
||||
throw new IllegalArgumentException("endPos must be greater than or equal to beginPos (endPos=" + endPos
|
||||
+ ", beginPos=" + beginPos + ")");
|
||||
}
|
||||
|
||||
if (endPos >= Math.min(a.length, b.length)) {
|
||||
@ -592,8 +545,7 @@ public class StringUtil {
|
||||
|
||||
/**
|
||||
* Finds and returns the index of the specified appearance of the specified
|
||||
* character
|
||||
* in the given array. The search starts at index 0.
|
||||
* character in the given array. The search starts at index 0.
|
||||
* <p>
|
||||
* Examples:
|
||||
* <p>
|
||||
@ -630,10 +582,12 @@ public class StringUtil {
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* @param src - the array to search in.
|
||||
* @param target - the character to search for.
|
||||
* @param skip - the amount of <code>target</code> characters to be
|
||||
* skipped.
|
||||
* @param src
|
||||
* - the array to search in.
|
||||
* @param target
|
||||
* - the character to search for.
|
||||
* @param skip
|
||||
* - the amount of <code>target</code> characters to be skipped.
|
||||
* @return The index of the <code>skip+1</code>th <code>target</code>
|
||||
* character or -1, if none found.
|
||||
* @see StringUtil#indexFromEnd(char[], char, int)
|
||||
@ -653,8 +607,7 @@ public class StringUtil {
|
||||
|
||||
/**
|
||||
* Finds and returns the index of the specified appearance of the specified
|
||||
* character
|
||||
* in the given array. The search starts at index
|
||||
* character in the given array. The search starts at index
|
||||
* <code>src.length - 1</code>.
|
||||
* <p>
|
||||
* Examples:
|
||||
@ -692,13 +645,15 @@ public class StringUtil {
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* @param src - the array to search in.
|
||||
* @param target - the character to search for.
|
||||
* @param skip - the amount of <code>target</code> characters to be
|
||||
* skipped.
|
||||
* @param src
|
||||
* - the array to search in.
|
||||
* @param target
|
||||
* - the character to search for.
|
||||
* @param skip
|
||||
* - the amount of <code>target</code> characters to be skipped.
|
||||
* @return The index of the <code>skip+1</code>th
|
||||
* <code>target</code>character
|
||||
* from the end of the array or -1, if none found.
|
||||
* <code>target</code>character from the end of the array or -1, if
|
||||
* none found.
|
||||
* @see StringUtil#indexFromBeginning(char[], char, int)
|
||||
*/
|
||||
public static int indexFromEnd(char[] src, char target, int skip) {
|
||||
@ -873,12 +828,8 @@ public class StringUtil {
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void buildCombinations(
|
||||
StringBuilder sb,
|
||||
Collection<String> result,
|
||||
Iterable<String>[] parts,
|
||||
int index
|
||||
) {
|
||||
private static void buildCombinations(StringBuilder sb, Collection<String> result, Iterable<String>[] parts,
|
||||
int index) {
|
||||
if (index >= parts.length) {
|
||||
result.add(sb.toString());
|
||||
} else {
|
||||
@ -904,13 +855,8 @@ public class StringUtil {
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void buildCombinations(
|
||||
StringBuilder sb,
|
||||
String[] result,
|
||||
int[] resultIndex,
|
||||
String[][] parts,
|
||||
int index
|
||||
) {
|
||||
private static void buildCombinations(StringBuilder sb, String[] result, int[] resultIndex, String[][] parts,
|
||||
int index) {
|
||||
if (index >= parts.length) {
|
||||
result[resultIndex[0]++] = sb.toString();
|
||||
} else {
|
||||
@ -985,10 +931,7 @@ public class StringUtil {
|
||||
}
|
||||
|
||||
private static char hexDigit(long value, int digit) {
|
||||
return hexDigit(
|
||||
(int) (value >>> (4 * digit))
|
||||
& 0xF
|
||||
);
|
||||
return hexDigit((int) (value >>> (4 * digit)) & 0xF);
|
||||
}
|
||||
|
||||
public static char hexDigit(int value) {
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars;
|
||||
|
||||
public class UncheckedEscapeException extends RuntimeException {
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars.reader;
|
||||
|
||||
/**
|
||||
@ -27,10 +27,9 @@ public abstract class AbstractCharReader implements CharReader {
|
||||
|
||||
/**
|
||||
* Current position of this CharReader. The reader maps its input to
|
||||
* positions starting from 0.
|
||||
* Positions that are negative or lower than 0 are invalid.
|
||||
* {@link #current()}
|
||||
* will throw an exception if position is invalid.
|
||||
* positions starting from 0. Positions that are negative or lower than 0
|
||||
* are invalid. {@link #current()} will throw an exception if position is
|
||||
* invalid.
|
||||
*/
|
||||
protected int position = 0;
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars.reader;
|
||||
|
||||
import java.util.Objects;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars.reader;
|
||||
|
||||
/**
|
||||
@ -51,9 +51,12 @@ public abstract class BufferedCharReader extends AbstractCharReader {
|
||||
/**
|
||||
* Acquires next characters and stores them in the array.
|
||||
*
|
||||
* @param buffer the output array
|
||||
* @param offset index of the first character
|
||||
* @param length maximum amount of characters to be pulled
|
||||
* @param buffer
|
||||
* the output array
|
||||
* @param offset
|
||||
* index of the first character
|
||||
* @param length
|
||||
* maximum amount of characters to be pulled
|
||||
* @return the amount of characters actually pulled
|
||||
*/
|
||||
protected int pullChars(char[] buffer, int offset, int length) {
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars.reader;
|
||||
|
||||
import java.io.IOException;
|
||||
@ -30,7 +30,7 @@ import ru.windcorp.jputil.chars.Escaper;
|
||||
*/
|
||||
|
||||
// SonarLint: Constants should not be defined in interfaces (java:S1214)
|
||||
// DONE is an essential part of the interface
|
||||
// DONE is an essential part of the interface
|
||||
@SuppressWarnings("squid:S1214")
|
||||
|
||||
public interface CharReader {
|
||||
@ -179,8 +179,7 @@ public interface CharReader {
|
||||
|
||||
/**
|
||||
* Skips to the end of the current line. Both <code>"\n"</code>,
|
||||
* <code>"\r"</code>
|
||||
* and <code>"\r\n"</code> are considered line separators.
|
||||
* <code>"\r"</code> and <code>"\r\n"</code> are considered line separators.
|
||||
*
|
||||
* @return the amount of characters in the skipped line
|
||||
*/
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars.reader;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars.reader;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.chars.reader;
|
||||
|
||||
import java.util.Objects;
|
||||
@ -38,8 +38,7 @@ public class StringCharReader extends AbstractCharReader {
|
||||
int end = offset + length;
|
||||
if (end > str.length() || offset < 0)
|
||||
throw new IllegalArgumentException(
|
||||
"String contains [0; " + str.length() + "), requested [" + offset + "; " + end + ")"
|
||||
);
|
||||
"String contains [0; " + str.length() + "), requested [" + offset + "; " + end + ")");
|
||||
|
||||
this.offset = offset;
|
||||
this.length = length;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.functions;
|
||||
|
||||
@FunctionalInterface
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.functions;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
@ -44,9 +44,16 @@ public interface ThrowingBiConsumer<T, U, E extends Exception> {
|
||||
}
|
||||
|
||||
public static <T, U, E extends Exception> ThrowingBiConsumer<T, U, E> concat(
|
||||
ThrowingBiConsumer<? super T, ? super U, ? extends E> first,
|
||||
ThrowingBiConsumer<? super T, ? super U, ? extends E> second
|
||||
) {
|
||||
ThrowingBiConsumer<? super T, ? super U, ? extends E> first,
|
||||
ThrowingBiConsumer<? super T, ? super U, ? extends E> second) {
|
||||
return (t, u) -> {
|
||||
first.accept(t, u);
|
||||
second.accept(t, u);
|
||||
};
|
||||
}
|
||||
|
||||
public static <T, U, E extends Exception> ThrowingBiConsumer<T, U, E> concat(BiConsumer<? super T, ? super U> first,
|
||||
ThrowingBiConsumer<? super T, ? super U, E> second) {
|
||||
return (t, u) -> {
|
||||
first.accept(t, u);
|
||||
second.accept(t, u);
|
||||
@ -54,19 +61,7 @@ public interface ThrowingBiConsumer<T, U, E extends Exception> {
|
||||
}
|
||||
|
||||
public static <T, U, E extends Exception> ThrowingBiConsumer<T, U, E> concat(
|
||||
BiConsumer<? super T, ? super U> first,
|
||||
ThrowingBiConsumer<? super T, ? super U, E> second
|
||||
) {
|
||||
return (t, u) -> {
|
||||
first.accept(t, u);
|
||||
second.accept(t, u);
|
||||
};
|
||||
}
|
||||
|
||||
public static <T, U, E extends Exception> ThrowingBiConsumer<T, U, E> concat(
|
||||
ThrowingBiConsumer<? super T, ? super U, E> first,
|
||||
BiConsumer<? super T, ? super U> second
|
||||
) {
|
||||
ThrowingBiConsumer<? super T, ? super U, E> first, BiConsumer<? super T, ? super U> second) {
|
||||
return (t, u) -> {
|
||||
first.accept(t, u);
|
||||
second.accept(t, u);
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.functions;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
@ -39,30 +39,24 @@ public interface ThrowingConsumer<T, E extends Exception> {
|
||||
};
|
||||
}
|
||||
|
||||
public static <T, E extends Exception> ThrowingConsumer<T, E> concat(
|
||||
ThrowingConsumer<? super T, ? extends E> first,
|
||||
ThrowingConsumer<? super T, ? extends E> second
|
||||
) {
|
||||
public static <T, E extends Exception> ThrowingConsumer<T, E> concat(ThrowingConsumer<? super T, ? extends E> first,
|
||||
ThrowingConsumer<? super T, ? extends E> second) {
|
||||
return t -> {
|
||||
first.accept(t);
|
||||
second.accept(t);
|
||||
};
|
||||
}
|
||||
|
||||
public static <T, E extends Exception> ThrowingConsumer<T, E> concat(
|
||||
Consumer<? super T> first,
|
||||
ThrowingConsumer<? super T, ? extends E> second
|
||||
) {
|
||||
public static <T, E extends Exception> ThrowingConsumer<T, E> concat(Consumer<? super T> first,
|
||||
ThrowingConsumer<? super T, ? extends E> second) {
|
||||
return t -> {
|
||||
first.accept(t);
|
||||
second.accept(t);
|
||||
};
|
||||
}
|
||||
|
||||
public static <T, E extends Exception> ThrowingConsumer<T, E> concat(
|
||||
ThrowingConsumer<? super T, ? extends E> first,
|
||||
Consumer<? super T> second
|
||||
) {
|
||||
public static <T, E extends Exception> ThrowingConsumer<T, E> concat(ThrowingConsumer<? super T, ? extends E> first,
|
||||
Consumer<? super T> second) {
|
||||
return t -> {
|
||||
first.accept(t);
|
||||
second.accept(t);
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.functions;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
@ -28,10 +28,8 @@ public interface ThrowingFunction<T, R, E extends Exception> {
|
||||
R apply(T t) throws E;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
default Function<T, R> withHandler(
|
||||
BiConsumer<? super T, ? super E> handler,
|
||||
Function<? super T, ? extends R> value
|
||||
) {
|
||||
default Function<T, R> withHandler(BiConsumer<? super T, ? super E> handler,
|
||||
Function<? super T, ? extends R> value) {
|
||||
return t -> {
|
||||
try {
|
||||
return apply(t);
|
||||
@ -58,23 +56,18 @@ public interface ThrowingFunction<T, R, E extends Exception> {
|
||||
}
|
||||
|
||||
public static <T, R, I, E extends Exception> ThrowingFunction<T, R, E> compose(
|
||||
ThrowingFunction<? super T, I, ? extends E> first,
|
||||
ThrowingFunction<? super I, ? extends R, ? extends E> second
|
||||
) {
|
||||
ThrowingFunction<? super T, I, ? extends E> first,
|
||||
ThrowingFunction<? super I, ? extends R, ? extends E> second) {
|
||||
return t -> second.apply(first.apply(t));
|
||||
}
|
||||
|
||||
public static <T, R, I, E extends Exception> ThrowingFunction<T, R, E> compose(Function<? super T, I> first,
|
||||
ThrowingFunction<? super I, ? extends R, E> second) {
|
||||
return t -> second.apply(first.apply(t));
|
||||
}
|
||||
|
||||
public static <T, R, I, E extends Exception> ThrowingFunction<T, R, E> compose(
|
||||
Function<? super T, I> first,
|
||||
ThrowingFunction<? super I, ? extends R, E> second
|
||||
) {
|
||||
return t -> second.apply(first.apply(t));
|
||||
}
|
||||
|
||||
public static <T, R, I, E extends Exception> ThrowingFunction<T, R, E> compose(
|
||||
ThrowingFunction<? super T, I, E> first,
|
||||
Function<? super I, ? extends R> second
|
||||
) {
|
||||
ThrowingFunction<? super T, I, E> first, Function<? super I, ? extends R> second) {
|
||||
return t -> second.apply(first.apply(t));
|
||||
}
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.functions;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
@ -38,10 +38,8 @@ public interface ThrowingRunnable<E extends Exception> {
|
||||
};
|
||||
}
|
||||
|
||||
public static <E extends Exception> ThrowingRunnable<E> concat(
|
||||
ThrowingRunnable<? extends E> first,
|
||||
ThrowingRunnable<? extends E> second
|
||||
) {
|
||||
public static <E extends Exception> ThrowingRunnable<E> concat(ThrowingRunnable<? extends E> first,
|
||||
ThrowingRunnable<? extends E> second) {
|
||||
return () -> {
|
||||
first.run();
|
||||
second.run();
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.functions;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.iterators;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.iterators;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.iterators;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.iterators;
|
||||
|
||||
import java.util.Iterator;
|
||||
@ -49,10 +49,8 @@ public class RangeIterator<E> implements Iterator<E> {
|
||||
public E next() {
|
||||
update();
|
||||
if (nextIndex >= from + amount) {
|
||||
throw new NoSuchElementException(
|
||||
"RangeIterator about to retrieve element " + nextIndex
|
||||
+ " which exceeds upper boundary " + (from + amount)
|
||||
);
|
||||
throw new NoSuchElementException("RangeIterator about to retrieve element " + nextIndex
|
||||
+ " which exceeds upper boundary " + (from + amount));
|
||||
}
|
||||
|
||||
E result = parent.next();
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.iterators;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.selectors;
|
||||
|
||||
public abstract class AbstractSelectorOperator implements SelectorOperator {
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.selectors;
|
||||
|
||||
import ru.windcorp.jputil.SyntaxException;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.selectors;
|
||||
|
||||
import ru.windcorp.jputil.SyntaxException;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.selectors;
|
||||
|
||||
import java.util.Deque;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.selectors;
|
||||
|
||||
import java.util.Deque;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.selectors;
|
||||
|
||||
import java.util.Deque;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.selectors;
|
||||
|
||||
import java.util.Deque;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.selectors;
|
||||
|
||||
import java.util.Deque;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.selectors;
|
||||
|
||||
import java.util.function.Predicate;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.selectors;
|
||||
|
||||
import java.util.function.Predicate;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.selectors;
|
||||
|
||||
import java.util.Deque;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.jputil.selectors;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -37,7 +37,7 @@ public class SelectorSystem<T> {
|
||||
private final Collection<Selector<T>> selectors = Collections.synchronizedCollection(new ArrayList<Selector<T>>());
|
||||
|
||||
private final Collection<SelectorOperator> operators = Collections
|
||||
.synchronizedCollection(new ArrayList<SelectorOperator>());
|
||||
.synchronizedCollection(new ArrayList<SelectorOperator>());
|
||||
|
||||
private String stackPrefix = null;
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia;
|
||||
|
||||
public class Progressia {
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia;
|
||||
|
||||
import ru.windcorp.progressia.common.util.crash.CrashReports;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia;
|
||||
|
||||
public interface Proxy {
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client;
|
||||
|
||||
import ru.windcorp.progressia.client.comms.DefaultClientCommsListener;
|
||||
@ -24,7 +24,7 @@ import ru.windcorp.progressia.client.graphics.world.Camera;
|
||||
import ru.windcorp.progressia.client.graphics.world.EntityAnchor;
|
||||
import ru.windcorp.progressia.client.graphics.world.LocalPlayer;
|
||||
import ru.windcorp.progressia.client.world.WorldRender;
|
||||
import ru.windcorp.progressia.common.world.WorldData;
|
||||
import ru.windcorp.progressia.common.world.DefaultWorldData;
|
||||
import ru.windcorp.progressia.common.world.entity.EntityData;
|
||||
|
||||
public class Client {
|
||||
@ -36,7 +36,7 @@ public class Client {
|
||||
|
||||
private final ServerCommsChannel comms;
|
||||
|
||||
public Client(WorldData world, ServerCommsChannel comms) {
|
||||
public Client(DefaultWorldData world, ServerCommsChannel comms) {
|
||||
this.world = new WorldRender(world, this);
|
||||
this.comms = comms;
|
||||
|
||||
@ -69,11 +69,7 @@ public class Client {
|
||||
return;
|
||||
}
|
||||
|
||||
getCamera().setAnchor(
|
||||
new EntityAnchor(
|
||||
getWorld().getEntityRenderable(entity)
|
||||
)
|
||||
);
|
||||
getCamera().setAnchor(new EntityAnchor(getWorld().getEntityRenderable(entity)));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client;
|
||||
|
||||
import ru.windcorp.progressia.Proxy;
|
||||
@ -42,10 +42,8 @@ public class ClientProxy implements Proxy {
|
||||
try {
|
||||
RenderTaskQueue.waitAndInvoke(FlatRenderProgram::init);
|
||||
RenderTaskQueue.waitAndInvoke(WorldRenderProgram::init);
|
||||
RenderTaskQueue.waitAndInvoke(
|
||||
() -> Typefaces
|
||||
.setDefault(GNUUnifontLoader.load(ResourceManager.getResource("assets/unifont-13.0.03.hex.gz")))
|
||||
);
|
||||
RenderTaskQueue.waitAndInvoke(() -> Typefaces
|
||||
.setDefault(GNUUnifontLoader.load(ResourceManager.getResource("assets/unifont-13.0.03.hex.gz"))));
|
||||
} catch (InterruptedException e) {
|
||||
throw CrashReports.report(e, "ClientProxy failed");
|
||||
}
|
||||
@ -60,7 +58,7 @@ public class ClientProxy implements Proxy {
|
||||
|
||||
ServerState.startServer();
|
||||
ClientState.connectToLocalServer();
|
||||
|
||||
|
||||
TestMusicPlayer.start();
|
||||
}
|
||||
|
||||
|
@ -15,13 +15,13 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client;
|
||||
|
||||
import ru.windcorp.progressia.client.comms.localhost.LocalServerCommsChannel;
|
||||
import ru.windcorp.progressia.client.graphics.GUI;
|
||||
import ru.windcorp.progressia.client.graphics.world.LayerWorld;
|
||||
import ru.windcorp.progressia.common.world.WorldData;
|
||||
import ru.windcorp.progressia.common.world.DefaultWorldData;
|
||||
import ru.windcorp.progressia.server.ServerState;
|
||||
import ru.windcorp.progressia.test.LayerAbout;
|
||||
import ru.windcorp.progressia.test.LayerTestUI;
|
||||
@ -41,11 +41,9 @@ public class ClientState {
|
||||
|
||||
public static void connectToLocalServer() {
|
||||
|
||||
WorldData world = new WorldData();
|
||||
DefaultWorldData world = new DefaultWorldData();
|
||||
|
||||
LocalServerCommsChannel channel = new LocalServerCommsChannel(
|
||||
ServerState.getInstance()
|
||||
);
|
||||
LocalServerCommsChannel channel = new LocalServerCommsChannel(ServerState.getInstance());
|
||||
|
||||
Client client = new Client(world, channel);
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client;
|
||||
|
||||
import ru.windcorp.progressia.ProgressiaLauncher;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.audio;
|
||||
|
||||
public enum AudioFormat {
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.audio;
|
||||
|
||||
import org.lwjgl.openal.*;
|
||||
@ -43,10 +43,7 @@ public class AudioManager {
|
||||
private static Speaker musicSpeaker;
|
||||
|
||||
public static void initAL() {
|
||||
String defaultDeviceName = alcGetString(
|
||||
0,
|
||||
ALC_DEFAULT_DEVICE_SPECIFIER
|
||||
);
|
||||
String defaultDeviceName = alcGetString(0, ALC_DEFAULT_DEVICE_SPECIFIER);
|
||||
|
||||
device = alcOpenDevice(defaultDeviceName);
|
||||
|
||||
@ -75,10 +72,7 @@ public class AudioManager {
|
||||
lastSoundIndex = 0;
|
||||
}
|
||||
speaker = soundSpeakers.get(lastSoundIndex);
|
||||
} while (
|
||||
speaker.getState()
|
||||
.equals(Speaker.State.PLAYING_LOOP)
|
||||
);
|
||||
} while (speaker.getState().equals(Speaker.State.PLAYING_LOOP));
|
||||
return speaker;
|
||||
}
|
||||
|
||||
|
@ -21,9 +21,9 @@ import ru.windcorp.progressia.client.audio.backend.SoundType;
|
||||
import ru.windcorp.progressia.common.util.namespaces.NamespacedInstanceRegistry;
|
||||
|
||||
public class AudioRegistry extends NamespacedInstanceRegistry<SoundType> {
|
||||
|
||||
|
||||
private static final AudioRegistry INSTANCE = new AudioRegistry();
|
||||
|
||||
|
||||
/**
|
||||
* @return the instance
|
||||
*/
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.audio;
|
||||
|
||||
import ru.windcorp.progressia.common.resource.ResourceManager;
|
||||
@ -29,10 +29,7 @@ public class AudioSystem {
|
||||
}
|
||||
|
||||
static void loadAudioData() {
|
||||
AudioManager.loadSound(
|
||||
ResourceManager.getResource("assets/sounds/block_destroy_clap.ogg"),
|
||||
"Progressia:BlockDestroy",
|
||||
AudioFormat.MONO
|
||||
);
|
||||
AudioManager.loadSound(ResourceManager.getResource("assets/sounds/block_destroy_clap.ogg"),
|
||||
"Progressia:BlockDestroy", AudioFormat.MONO);
|
||||
}
|
||||
}
|
||||
|
@ -15,18 +15,15 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.audio;
|
||||
|
||||
import glm.vec._3.Vec3;
|
||||
import ru.windcorp.progressia.client.audio.backend.SoundType;
|
||||
import ru.windcorp.progressia.client.audio.backend.Speaker;
|
||||
|
||||
public class Music
|
||||
extends Sound {
|
||||
|
||||
|
||||
|
||||
public class Music extends Sound {
|
||||
|
||||
public Music(SoundType soundType, int timeLength, float pitch, float gain) {
|
||||
super(soundType, timeLength, new Vec3(), new Vec3(), pitch, gain);
|
||||
}
|
||||
@ -47,7 +44,7 @@ public class Music
|
||||
protected Speaker initSpeaker() {
|
||||
return AudioManager.initMusicSpeaker(soundType);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void setPosition(Vec3 position) {
|
||||
throw new UnsupportedOperationException();
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.audio;
|
||||
|
||||
import glm.vec._3.Vec3;
|
||||
@ -29,9 +29,9 @@ public class Sound {
|
||||
protected float pitch = 1.0f;
|
||||
protected float gain = 1.0f;
|
||||
protected int timeLength = 0;
|
||||
|
||||
|
||||
protected SoundType soundType;
|
||||
|
||||
|
||||
public Sound(SoundType soundType) {
|
||||
this.soundType = soundType;
|
||||
}
|
||||
@ -39,37 +39,23 @@ public class Sound {
|
||||
public Sound(String id) {
|
||||
this(AudioRegistry.getInstance().get(id));
|
||||
}
|
||||
|
||||
public Sound(
|
||||
String id,
|
||||
int timeLength,
|
||||
Vec3 position,
|
||||
Vec3 velocity,
|
||||
float pitch,
|
||||
float gain
|
||||
) {
|
||||
|
||||
public Sound(String id, int timeLength, Vec3 position, Vec3 velocity, float pitch, float gain) {
|
||||
this(id);
|
||||
this.position = position;
|
||||
this.velocity = velocity;
|
||||
this.pitch = pitch;
|
||||
this.gain = gain;
|
||||
}
|
||||
|
||||
public Sound(
|
||||
SoundType soundType,
|
||||
int timeLength,
|
||||
Vec3 position,
|
||||
Vec3 velocity,
|
||||
float pitch,
|
||||
float gain
|
||||
) {
|
||||
|
||||
public Sound(SoundType soundType, int timeLength, Vec3 position, Vec3 velocity, float pitch, float gain) {
|
||||
this(soundType);
|
||||
this.position = position;
|
||||
this.velocity = velocity;
|
||||
this.pitch = pitch;
|
||||
this.gain = gain;
|
||||
}
|
||||
|
||||
|
||||
protected Speaker initSpeaker() {
|
||||
return AudioManager.initSpeaker(soundType);
|
||||
}
|
||||
@ -119,7 +105,7 @@ public class Sound {
|
||||
public float getPitch() {
|
||||
return pitch;
|
||||
}
|
||||
|
||||
|
||||
public double getDuration() {
|
||||
return soundType.getDuration();
|
||||
}
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.audio.backend;
|
||||
|
||||
import org.lwjgl.BufferUtils;
|
||||
@ -39,12 +39,7 @@ public class AudioReader {
|
||||
|
||||
ShortBuffer rawAudio = decodeVorbis(resource, channelBuffer, rateBuffer);
|
||||
|
||||
return new SoundType(
|
||||
id,
|
||||
rawAudio,
|
||||
format,
|
||||
rateBuffer.get(0)
|
||||
);
|
||||
return new SoundType(id, rawAudio, format, rateBuffer.get(0));
|
||||
}
|
||||
|
||||
public static SoundType readAsMono(Resource resource, String id) {
|
||||
@ -55,15 +50,7 @@ public class AudioReader {
|
||||
return readAsSpecified(resource, id, AL_FORMAT_STEREO16);
|
||||
}
|
||||
|
||||
private static ShortBuffer decodeVorbis(
|
||||
Resource dataToDecode,
|
||||
IntBuffer channelsBuffer,
|
||||
IntBuffer rateBuffer
|
||||
) {
|
||||
return stb_vorbis_decode_memory(
|
||||
dataToDecode.readAsBytes(),
|
||||
channelsBuffer,
|
||||
rateBuffer
|
||||
);
|
||||
private static ShortBuffer decodeVorbis(Resource dataToDecode, IntBuffer channelsBuffer, IntBuffer rateBuffer) {
|
||||
return stb_vorbis_decode_memory(dataToDecode.readAsBytes(), channelsBuffer, rateBuffer);
|
||||
}
|
||||
}
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.audio.backend;
|
||||
|
||||
import glm.vec._3.Vec3;
|
||||
@ -55,9 +55,8 @@ public class Listener {
|
||||
if (isInWorld) {
|
||||
|
||||
if (wasInWorld) {
|
||||
velocity.set(camera.getLastAnchorPosition()).sub(position).div(
|
||||
(float) GraphicsInterface.getFrameLength()
|
||||
);
|
||||
velocity.set(camera.getLastAnchorPosition()).sub(position)
|
||||
.div((float) GraphicsInterface.getFrameLength());
|
||||
} else {
|
||||
// If !wasInWorld, previous position is nonsence. Assume 0.
|
||||
velocity.set(0);
|
||||
@ -72,9 +71,9 @@ public class Listener {
|
||||
}
|
||||
|
||||
/*
|
||||
* Only apply if there is a chance that params changed.
|
||||
* This can only happen if we are in world now (isInWorld) or we just
|
||||
* left world (wasInWorld, then we need to reset).
|
||||
* Only apply if there is a chance that params changed. This can only
|
||||
* happen if we are in world now (isInWorld) or we just left world
|
||||
* (wasInWorld, then we need to reset).
|
||||
*/
|
||||
if (isInWorld || wasInWorld) {
|
||||
applyParams();
|
||||
@ -91,17 +90,7 @@ public class Listener {
|
||||
private void applyParams() {
|
||||
alListener3f(AL_POSITION, position.x, position.y, position.z);
|
||||
alListener3f(AL_VELOCITY, velocity.x, velocity.y, velocity.z);
|
||||
alListenerfv(
|
||||
AL_ORIENTATION,
|
||||
new float[] {
|
||||
oriAt.x,
|
||||
oriAt.y,
|
||||
oriAt.z,
|
||||
oriUp.x,
|
||||
oriUp.y,
|
||||
oriUp.z
|
||||
}
|
||||
);
|
||||
alListenerfv(AL_ORIENTATION, new float[] { oriAt.x, oriAt.y, oriAt.z, oriUp.x, oriUp.y, oriUp.z });
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.audio.backend;
|
||||
|
||||
import ru.windcorp.progressia.common.util.namespaces.Namespaced;
|
||||
@ -34,12 +34,7 @@ public class SoundType extends Namespaced {
|
||||
private int audioBuffer;
|
||||
private double duration;
|
||||
|
||||
public SoundType(
|
||||
String id,
|
||||
ShortBuffer rawAudio,
|
||||
int format,
|
||||
int sampleRate
|
||||
) {
|
||||
public SoundType(String id, ShortBuffer rawAudio, int format, int sampleRate) {
|
||||
super(id);
|
||||
this.rawAudio = rawAudio;
|
||||
this.sampleRate = sampleRate;
|
||||
@ -56,7 +51,7 @@ public class SoundType extends Namespaced {
|
||||
public void initSpeaker(Speaker speaker) {
|
||||
speaker.setAudioData(audioBuffer);
|
||||
}
|
||||
|
||||
|
||||
public double getDuration() {
|
||||
return duration;
|
||||
}
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.audio.backend;
|
||||
|
||||
import glm.vec._3.Vec3;
|
||||
@ -24,9 +24,7 @@ import static org.lwjgl.openal.AL11.*;
|
||||
public class Speaker {
|
||||
|
||||
public enum State {
|
||||
NOT_PLAYING,
|
||||
PLAYING,
|
||||
PLAYING_LOOP
|
||||
NOT_PLAYING, PLAYING, PLAYING_LOOP
|
||||
}
|
||||
|
||||
// Buffers
|
||||
@ -49,13 +47,7 @@ public class Speaker {
|
||||
setAudioData(audioData);
|
||||
}
|
||||
|
||||
public Speaker(
|
||||
int audioData,
|
||||
Vec3 position,
|
||||
Vec3 velocity,
|
||||
float pitch,
|
||||
float gain
|
||||
) {
|
||||
public Speaker(int audioData, Vec3 position, Vec3 velocity, float pitch, float gain) {
|
||||
setAudioData(audioData);
|
||||
setPosition(position);
|
||||
setVelocity(velocity);
|
||||
@ -63,12 +55,7 @@ public class Speaker {
|
||||
setGain(gain);
|
||||
}
|
||||
|
||||
public Speaker(
|
||||
Vec3 position,
|
||||
Vec3 velocity,
|
||||
float pitch,
|
||||
float gain
|
||||
) {
|
||||
public Speaker(Vec3 position, Vec3 velocity, float pitch, float gain) {
|
||||
setPosition(position);
|
||||
setVelocity(velocity);
|
||||
setPitch(pitch);
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.comms;
|
||||
|
||||
import java.io.IOException;
|
||||
@ -39,9 +39,7 @@ public class DefaultClientCommsListener implements CommsListener {
|
||||
@Override
|
||||
public void onPacketReceived(Packet packet) {
|
||||
if (packet instanceof PacketAffectWorld) {
|
||||
((PacketAffectWorld) packet).apply(
|
||||
getClient().getWorld().getData()
|
||||
);
|
||||
((PacketAffectWorld) packet).apply(getClient().getWorld().getData());
|
||||
} else if (packet instanceof PacketSetLocalPlayer) {
|
||||
setLocalPlayer((PacketSetLocalPlayer) packet);
|
||||
}
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.comms;
|
||||
|
||||
import ru.windcorp.progressia.common.comms.CommsChannel;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.comms.controls;
|
||||
|
||||
import ru.windcorp.progressia.common.util.namespaces.Namespaced;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.comms.controls;
|
||||
|
||||
import ru.windcorp.progressia.client.graphics.input.InputEvent;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.comms.controls;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
@ -33,17 +33,12 @@ public class ControlTriggerLambda extends ControlTriggerInputBased {
|
||||
private final Predicate<InputEvent> predicate;
|
||||
private final BiConsumer<InputEvent, ControlData> dataWriter;
|
||||
|
||||
public ControlTriggerLambda(
|
||||
String id,
|
||||
Predicate<InputEvent> predicate,
|
||||
BiConsumer<InputEvent, ControlData> dataWriter
|
||||
) {
|
||||
public ControlTriggerLambda(String id, Predicate<InputEvent> predicate,
|
||||
BiConsumer<InputEvent, ControlData> dataWriter) {
|
||||
super(id);
|
||||
|
||||
this.packetId = NamespacedUtil.getId(
|
||||
NamespacedUtil.getNamespace(id),
|
||||
"ControlKeyPress" + NamespacedUtil.getName(id)
|
||||
);
|
||||
this.packetId = NamespacedUtil.getId(NamespacedUtil.getNamespace(id),
|
||||
"ControlKeyPress" + NamespacedUtil.getName(id));
|
||||
|
||||
this.predicate = predicate;
|
||||
this.dataWriter = dataWriter;
|
||||
@ -54,10 +49,7 @@ public class ControlTriggerLambda extends ControlTriggerInputBased {
|
||||
if (!predicate.test(event))
|
||||
return null;
|
||||
|
||||
PacketControl packet = new PacketControl(
|
||||
packetId,
|
||||
ControlDataRegistry.getInstance().create(getId())
|
||||
);
|
||||
PacketControl packet = new PacketControl(packetId, ControlDataRegistry.getInstance().create(getId()));
|
||||
|
||||
dataWriter.accept(event, packet.getControl());
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.comms.controls;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
@ -29,11 +29,7 @@ public class ControlTriggerLocalLambda extends ControlTriggerInputBased {
|
||||
private final Predicate<InputEvent> predicate;
|
||||
private final Consumer<InputEvent> action;
|
||||
|
||||
public ControlTriggerLocalLambda(
|
||||
String id,
|
||||
Predicate<InputEvent> predicate,
|
||||
Consumer<InputEvent> action
|
||||
) {
|
||||
public ControlTriggerLocalLambda(String id, Predicate<InputEvent> predicate, Consumer<InputEvent> action) {
|
||||
super(id);
|
||||
|
||||
this.predicate = predicate;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.comms.controls;
|
||||
|
||||
import ru.windcorp.progressia.common.util.namespaces.NamespacedInstanceRegistry;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.comms.controls;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
@ -27,122 +27,59 @@ import ru.windcorp.progressia.common.comms.controls.ControlData;
|
||||
|
||||
public class ControlTriggers {
|
||||
|
||||
public static ControlTriggerInputBased of(
|
||||
String id,
|
||||
BiConsumer<InputEvent, ControlData> dataWriter,
|
||||
Predicate<InputEvent> predicate
|
||||
) {
|
||||
public static ControlTriggerInputBased of(String id, BiConsumer<InputEvent, ControlData> dataWriter,
|
||||
Predicate<InputEvent> predicate) {
|
||||
return new ControlTriggerLambda(id, predicate, dataWriter);
|
||||
}
|
||||
|
||||
public static ControlTriggerInputBased of(
|
||||
String id,
|
||||
Consumer<ControlData> dataWriter,
|
||||
Predicate<InputEvent> predicate
|
||||
) {
|
||||
return of(
|
||||
id,
|
||||
(input, control) -> dataWriter.accept(control),
|
||||
predicate
|
||||
);
|
||||
public static ControlTriggerInputBased of(String id, Consumer<ControlData> dataWriter,
|
||||
Predicate<InputEvent> predicate) {
|
||||
return of(id, (input, control) -> dataWriter.accept(control), predicate);
|
||||
}
|
||||
|
||||
public static ControlTriggerInputBased of(
|
||||
String id,
|
||||
Predicate<InputEvent> predicate
|
||||
) {
|
||||
return of(
|
||||
id,
|
||||
(input, control) -> {
|
||||
},
|
||||
predicate
|
||||
);
|
||||
public static ControlTriggerInputBased of(String id, Predicate<InputEvent> predicate) {
|
||||
return of(id, (input, control) -> {
|
||||
}, predicate);
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public static <I extends InputEvent> ControlTriggerInputBased of(
|
||||
String id,
|
||||
Class<I> inputType,
|
||||
BiConsumer<I, ControlData> dataWriter,
|
||||
Predicate<I>... predicates
|
||||
) {
|
||||
return of(
|
||||
id,
|
||||
createCheckedDataWriter(inputType, dataWriter),
|
||||
createCheckedCompoundPredicate(inputType, predicates)
|
||||
);
|
||||
public static <I extends InputEvent> ControlTriggerInputBased of(String id, Class<I> inputType,
|
||||
BiConsumer<I, ControlData> dataWriter, Predicate<I>... predicates) {
|
||||
return of(id, createCheckedDataWriter(inputType, dataWriter),
|
||||
createCheckedCompoundPredicate(inputType, predicates));
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public static <I extends InputEvent> ControlTriggerInputBased of(
|
||||
String id,
|
||||
Class<I> inputType,
|
||||
Consumer<ControlData> dataWriter,
|
||||
Predicate<I>... predicates
|
||||
) {
|
||||
return of(
|
||||
id,
|
||||
inputType,
|
||||
(input, control) -> dataWriter.accept(control),
|
||||
predicates
|
||||
);
|
||||
public static <I extends InputEvent> ControlTriggerInputBased of(String id, Class<I> inputType,
|
||||
Consumer<ControlData> dataWriter, Predicate<I>... predicates) {
|
||||
return of(id, inputType, (input, control) -> dataWriter.accept(control), predicates);
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public static <I extends InputEvent> ControlTriggerInputBased of(
|
||||
String id,
|
||||
Class<I> inputType,
|
||||
Predicate<I>... predicates
|
||||
) {
|
||||
return of(
|
||||
id,
|
||||
(input, control) -> {
|
||||
},
|
||||
createCheckedCompoundPredicate(inputType, predicates)
|
||||
);
|
||||
public static <I extends InputEvent> ControlTriggerInputBased of(String id, Class<I> inputType,
|
||||
Predicate<I>... predicates) {
|
||||
return of(id, (input, control) -> {
|
||||
}, createCheckedCompoundPredicate(inputType, predicates));
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public static ControlTriggerInputBased of(
|
||||
String id,
|
||||
BiConsumer<InputEvent, ControlData> dataWriter,
|
||||
Predicate<InputEvent>... predicates
|
||||
) {
|
||||
return of(
|
||||
id,
|
||||
InputEvent.class,
|
||||
dataWriter,
|
||||
predicates
|
||||
);
|
||||
public static ControlTriggerInputBased of(String id, BiConsumer<InputEvent, ControlData> dataWriter,
|
||||
Predicate<InputEvent>... predicates) {
|
||||
return of(id, InputEvent.class, dataWriter, predicates);
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public static <I extends InputEvent> ControlTriggerInputBased of(
|
||||
String id,
|
||||
Consumer<ControlData> dataWriter,
|
||||
Predicate<InputEvent>... predicates
|
||||
) {
|
||||
return of(
|
||||
id,
|
||||
(input, control) -> dataWriter.accept(control),
|
||||
predicates
|
||||
);
|
||||
public static <I extends InputEvent> ControlTriggerInputBased of(String id, Consumer<ControlData> dataWriter,
|
||||
Predicate<InputEvent>... predicates) {
|
||||
return of(id, (input, control) -> dataWriter.accept(control), predicates);
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public static ControlTriggerInputBased of(
|
||||
String id,
|
||||
Predicate<InputEvent>... predicates
|
||||
) {
|
||||
return of(
|
||||
id,
|
||||
InputEvent.class,
|
||||
(input, control) -> {
|
||||
},
|
||||
predicates
|
||||
);
|
||||
public static ControlTriggerInputBased of(String id, Predicate<InputEvent>... predicates) {
|
||||
return of(id, InputEvent.class, (input, control) -> {
|
||||
}, predicates);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
//
|
||||
///
|
||||
@ -156,101 +93,53 @@ public class ControlTriggers {
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
public static ControlTriggerInputBased localOf(
|
||||
String id,
|
||||
Consumer<InputEvent> action,
|
||||
Predicate<InputEvent> predicate
|
||||
) {
|
||||
|
||||
public static ControlTriggerInputBased localOf(String id, Consumer<InputEvent> action,
|
||||
Predicate<InputEvent> predicate) {
|
||||
return new ControlTriggerLocalLambda(id, predicate, action);
|
||||
}
|
||||
|
||||
public static ControlTriggerInputBased localOf(
|
||||
String id,
|
||||
Runnable action,
|
||||
Predicate<InputEvent> predicate
|
||||
) {
|
||||
return localOf(
|
||||
id,
|
||||
input -> action.run(),
|
||||
predicate
|
||||
);
|
||||
public static ControlTriggerInputBased localOf(String id, Runnable action, Predicate<InputEvent> predicate) {
|
||||
return localOf(id, input -> action.run(), predicate);
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public static <I extends InputEvent> ControlTriggerInputBased localOf(
|
||||
String id,
|
||||
Class<I> inputType,
|
||||
Consumer<I> action,
|
||||
Predicate<I>... predicates
|
||||
) {
|
||||
return localOf(
|
||||
id,
|
||||
createCheckedAction(inputType, action),
|
||||
createCheckedCompoundPredicate(inputType, predicates)
|
||||
);
|
||||
public static <I extends InputEvent> ControlTriggerInputBased localOf(String id, Class<I> inputType,
|
||||
Consumer<I> action, Predicate<I>... predicates) {
|
||||
return localOf(id, createCheckedAction(inputType, action),
|
||||
createCheckedCompoundPredicate(inputType, predicates));
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public static <I extends InputEvent> ControlTriggerInputBased localOf(
|
||||
String id,
|
||||
Class<I> inputType,
|
||||
Runnable action,
|
||||
Predicate<I>... predicates
|
||||
) {
|
||||
return localOf(
|
||||
id,
|
||||
inputType,
|
||||
input -> action.run(),
|
||||
predicates
|
||||
);
|
||||
public static <I extends InputEvent> ControlTriggerInputBased localOf(String id, Class<I> inputType,
|
||||
Runnable action, Predicate<I>... predicates) {
|
||||
return localOf(id, inputType, input -> action.run(), predicates);
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public static ControlTriggerInputBased localOf(
|
||||
String id,
|
||||
Consumer<InputEvent> action,
|
||||
Predicate<InputEvent>... predicates
|
||||
) {
|
||||
return localOf(
|
||||
id,
|
||||
InputEvent.class,
|
||||
action,
|
||||
predicates
|
||||
);
|
||||
public static ControlTriggerInputBased localOf(String id, Consumer<InputEvent> action,
|
||||
Predicate<InputEvent>... predicates) {
|
||||
return localOf(id, InputEvent.class, action, predicates);
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public static <I extends InputEvent> ControlTriggerInputBased localOf(
|
||||
String id,
|
||||
Runnable action,
|
||||
Predicate<InputEvent>... predicates
|
||||
) {
|
||||
return of(
|
||||
id,
|
||||
input -> action.run(),
|
||||
predicates
|
||||
);
|
||||
public static <I extends InputEvent> ControlTriggerInputBased localOf(String id, Runnable action,
|
||||
Predicate<InputEvent>... predicates) {
|
||||
return of(id, input -> action.run(), predicates);
|
||||
}
|
||||
|
||||
private static <I extends InputEvent> BiConsumer<InputEvent, ControlData> createCheckedDataWriter(
|
||||
Class<I> inputType,
|
||||
BiConsumer<I, ControlData> dataWriter
|
||||
) {
|
||||
Class<I> inputType, BiConsumer<I, ControlData> dataWriter) {
|
||||
return (inputEvent, control) -> dataWriter.accept(inputType.cast(inputEvent), control);
|
||||
}
|
||||
|
||||
private static <I extends InputEvent> Consumer<InputEvent> createCheckedAction(
|
||||
Class<I> inputType,
|
||||
Consumer<I> action
|
||||
) {
|
||||
|
||||
private static <I extends InputEvent> Consumer<InputEvent> createCheckedAction(Class<I> inputType,
|
||||
Consumer<I> action) {
|
||||
return inputEvent -> action.accept(inputType.cast(inputEvent));
|
||||
}
|
||||
|
||||
private static <I extends InputEvent> Predicate<InputEvent> createCheckedCompoundPredicate(
|
||||
Class<I> inputType,
|
||||
Predicate<I>[] predicates
|
||||
) {
|
||||
private static <I extends InputEvent> Predicate<InputEvent> createCheckedCompoundPredicate(Class<I> inputType,
|
||||
Predicate<I>[] predicates) {
|
||||
return new CompoundCastPredicate<>(inputType, predicates);
|
||||
}
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.comms.controls;
|
||||
|
||||
import ru.windcorp.progressia.client.Client;
|
||||
@ -32,8 +32,7 @@ public class InputBasedControls {
|
||||
this.client = client;
|
||||
|
||||
this.controls = ControlTriggerRegistry.getInstance().values().stream()
|
||||
.filter(ControlTriggerInputBased.class::isInstance)
|
||||
.toArray(ControlTriggerInputBased[]::new);
|
||||
.filter(ControlTriggerInputBased.class::isInstance).toArray(ControlTriggerInputBased[]::new);
|
||||
}
|
||||
|
||||
public void handleInput(Input input) {
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.comms.localhost;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.comms.localhost;
|
||||
|
||||
import ru.windcorp.progressia.client.comms.ServerCommsChannel;
|
||||
@ -34,11 +34,7 @@ public class LocalServerCommsChannel extends ServerCommsChannel {
|
||||
public void connect(String login) {
|
||||
setState(State.CONNECTED);
|
||||
|
||||
this.localClient = new LocalClient(
|
||||
server.getClientManager().grabClientId(),
|
||||
login,
|
||||
this
|
||||
);
|
||||
this.localClient = new LocalClient(server.getClientManager().grabClientId(), login, this);
|
||||
|
||||
server.getClientManager().addClient(localClient);
|
||||
}
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -43,7 +43,7 @@ public class GUI {
|
||||
}
|
||||
|
||||
private static final List<LayerStackModification> MODIFICATION_QUEUE = Collections
|
||||
.synchronizedList(new ArrayList<>());
|
||||
.synchronizedList(new ArrayList<>());
|
||||
|
||||
private static class ModifiableInput extends Input {
|
||||
@Override
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend;
|
||||
|
||||
import java.util.ArrayDeque;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend;
|
||||
|
||||
import glm.vec._2.i.Vec2i;
|
||||
@ -61,7 +61,7 @@ public class GraphicsBackend {
|
||||
static void setOpenGLInitialized(boolean isOpenGLInitialized) {
|
||||
GraphicsBackend.isOpenGLInitialized = isOpenGLInitialized;
|
||||
}
|
||||
|
||||
|
||||
public static void initialize() {
|
||||
startRenderThread();
|
||||
}
|
||||
@ -159,27 +159,14 @@ public class GraphicsBackend {
|
||||
|
||||
public static void setFullscreen() {
|
||||
GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
|
||||
glfwSetWindowMonitor(
|
||||
getWindowHandle(),
|
||||
glfwGetPrimaryMonitor(),
|
||||
0,
|
||||
0,
|
||||
vidmode.width(),
|
||||
vidmode.height(),
|
||||
0);
|
||||
glfwSetWindowMonitor(getWindowHandle(), glfwGetPrimaryMonitor(), 0, 0, vidmode.width(), vidmode.height(), 0);
|
||||
isFullscreen = true;
|
||||
}
|
||||
|
||||
public static void setWindowed() {
|
||||
GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
|
||||
glfwSetWindowMonitor(
|
||||
getWindowHandle(),
|
||||
0,
|
||||
(vidmode.width() - getFrameWidth()) / 2,
|
||||
(vidmode.height() - getFrameHeight()) / 2,
|
||||
getFrameWidth(),
|
||||
getFrameHeight(),
|
||||
0);
|
||||
glfwSetWindowMonitor(getWindowHandle(), 0, (vidmode.width() - getFrameWidth()) / 2,
|
||||
(vidmode.height() - getFrameHeight()) / 2, getFrameWidth(), getFrameHeight(), 0);
|
||||
isFullscreen = false;
|
||||
}
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend;
|
||||
|
||||
import glm.vec._2.i.Vec2i;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend;
|
||||
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
@ -49,13 +49,7 @@ public class InputHandler {
|
||||
|
||||
private static final ModifiableKeyEvent THE_KEY_EVENT = new ModifiableKeyEvent();
|
||||
|
||||
static void handleKeyInput(
|
||||
long window,
|
||||
int key,
|
||||
int scancode,
|
||||
int action,
|
||||
int mods
|
||||
) {
|
||||
static void handleKeyInput(long window, int key, int scancode, int action, int mods) {
|
||||
if (GraphicsBackend.getWindowHandle() != window)
|
||||
return;
|
||||
THE_KEY_EVENT.initialize(key, scancode, action, mods);
|
||||
@ -71,12 +65,7 @@ public class InputHandler {
|
||||
}
|
||||
}
|
||||
|
||||
static void handleMouseButtonInput(
|
||||
long window,
|
||||
int key,
|
||||
int action,
|
||||
int mods
|
||||
) {
|
||||
static void handleMouseButtonInput(long window, int key, int action, int mods) {
|
||||
handleKeyInput(window, key, Integer.MAX_VALUE - key, action, mods);
|
||||
}
|
||||
|
||||
@ -97,11 +86,7 @@ public class InputHandler {
|
||||
|
||||
private static final ModifiableCursorMoveEvent THE_CURSOR_MOVE_EVENT = new ModifiableCursorMoveEvent();
|
||||
|
||||
static void handleMouseMoveInput(
|
||||
long window,
|
||||
double x,
|
||||
double y
|
||||
) {
|
||||
static void handleMouseMoveInput(long window, double x, double y) {
|
||||
if (GraphicsBackend.getWindowHandle() != window)
|
||||
return;
|
||||
y = GraphicsInterface.getFrameHeight() - y; // Flip y axis
|
||||
@ -131,11 +116,7 @@ public class InputHandler {
|
||||
|
||||
private static final ModifiableWheelScrollEvent THE_WHEEL_SCROLL_EVENT = new ModifiableWheelScrollEvent();
|
||||
|
||||
static void handleWheelScroll(
|
||||
long window,
|
||||
double xoffset,
|
||||
double yoffset
|
||||
) {
|
||||
static void handleWheelScroll(long window, double xoffset, double yoffset) {
|
||||
if (GraphicsBackend.getWindowHandle() != window)
|
||||
return;
|
||||
THE_WHEEL_SCROLL_EVENT.initialize(xoffset, yoffset);
|
||||
@ -162,10 +143,7 @@ public class InputHandler {
|
||||
/*
|
||||
* NB: this is NOT a GLFW callback, the raw callback is in GraphicsBackend
|
||||
*/
|
||||
static void handleFrameResize(
|
||||
int width,
|
||||
int height
|
||||
) {
|
||||
static void handleFrameResize(int width, int height) {
|
||||
THE_FRAME_RESIZE_EVENT.initialize(width, height);
|
||||
dispatch(THE_FRAME_RESIZE_EVENT);
|
||||
}
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend;
|
||||
|
||||
import glm.vec._2.d.Vec2d;
|
||||
@ -24,10 +24,7 @@ import gnu.trove.set.hash.TIntHashSet;
|
||||
|
||||
public class InputTracker {
|
||||
|
||||
private static final Vec2d CURSOR_POSITION = new Vec2d(
|
||||
Double.NaN,
|
||||
Double.NaN
|
||||
);
|
||||
private static final Vec2d CURSOR_POSITION = new Vec2d(Double.NaN, Double.NaN);
|
||||
|
||||
private static final TIntSet PRESSED_KEYS = new TIntHashSet(256);
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend;
|
||||
|
||||
import static org.lwjgl.opengl.GL11.*;
|
||||
@ -66,7 +66,7 @@ class LWJGLInitializer {
|
||||
GraphicsBackend.setWindowHandle(handle);
|
||||
|
||||
glfwMakeContextCurrent(handle);
|
||||
glfwSwapInterval(0); // TODO: remove after config system is added
|
||||
glfwSwapInterval(0); // TODO: remove after config system is added
|
||||
}
|
||||
|
||||
private static void positionWindow() {
|
||||
@ -92,16 +92,10 @@ class LWJGLInitializer {
|
||||
private static void setupWindowCallbacks() {
|
||||
long handle = GraphicsBackend.getWindowHandle();
|
||||
|
||||
glfwSetFramebufferSizeCallback(
|
||||
handle,
|
||||
GraphicsBackend::onFrameResized
|
||||
);
|
||||
glfwSetFramebufferSizeCallback(handle, GraphicsBackend::onFrameResized);
|
||||
|
||||
glfwSetKeyCallback(handle, InputHandler::handleKeyInput);
|
||||
glfwSetMouseButtonCallback(
|
||||
handle,
|
||||
InputHandler::handleMouseButtonInput
|
||||
);
|
||||
glfwSetMouseButtonCallback(handle, InputHandler::handleMouseButtonInput);
|
||||
|
||||
glfwSetCursorPosCallback(handle, InputHandler::handleMouseMoveInput);
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend;
|
||||
|
||||
import java.lang.ref.PhantomReference;
|
||||
@ -34,19 +34,13 @@ public class OpenGLObjectTracker {
|
||||
private static final ReferenceQueue<OpenGLDeletable> DELETE_QUEUE = new ReferenceQueue<>();
|
||||
|
||||
public synchronized static void register(OpenGLDeletable object, IntConsumer glDeleter) {
|
||||
GLPhantomReference<OpenGLDeletable> glRef = new GLPhantomReference<>(
|
||||
object,
|
||||
DELETE_QUEUE,
|
||||
object.getHandle(),
|
||||
glDeleter
|
||||
);
|
||||
GLPhantomReference<OpenGLDeletable> glRef = new GLPhantomReference<>(object, DELETE_QUEUE, object.getHandle(),
|
||||
glDeleter);
|
||||
TO_DELETE.add(glRef);
|
||||
}
|
||||
|
||||
public static void deleteAllObjects() {
|
||||
for (
|
||||
GLPhantomReference<OpenGLDeletable> glRef : TO_DELETE
|
||||
) {
|
||||
for (GLPhantomReference<OpenGLDeletable> glRef : TO_DELETE) {
|
||||
glRef.clear();
|
||||
}
|
||||
}
|
||||
@ -75,20 +69,16 @@ public class OpenGLObjectTracker {
|
||||
* It is possible to create a phantom reference with a {@code null}
|
||||
* queue, but such a reference is completely useless: Its {@code get}
|
||||
* method will always return {@code null} and, since it does not have a
|
||||
* queue,
|
||||
* it will never be enqueued.
|
||||
* queue, it will never be enqueued.
|
||||
*
|
||||
* @param referent the object the new phantom reference will refer to
|
||||
* @param q the queue with which the reference is to be
|
||||
* registered,
|
||||
* or {@code null} if registration is not required
|
||||
* @param referent
|
||||
* the object the new phantom reference will refer to
|
||||
* @param q
|
||||
* the queue with which the reference is to be registered, or
|
||||
* {@code null} if registration is not required
|
||||
*/
|
||||
public GLPhantomReference(
|
||||
T referent,
|
||||
ReferenceQueue<? super T> q,
|
||||
int referentGLhandle,
|
||||
IntConsumer GLDeleter
|
||||
) {
|
||||
public GLPhantomReference(T referent, ReferenceQueue<? super T> q, int referentGLhandle,
|
||||
IntConsumer GLDeleter) {
|
||||
super(referent, q);
|
||||
this.referentGLhandle = referentGLhandle;
|
||||
this.GLDeleter = GLDeleter;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend;
|
||||
|
||||
import ru.windcorp.jputil.functions.ThrowingRunnable;
|
||||
@ -41,11 +41,7 @@ public class RenderTaskQueue {
|
||||
HANDLER.invokeNow(task);
|
||||
}
|
||||
|
||||
public static <E extends Exception> void waitAndInvoke(
|
||||
ThrowingRunnable<E> task
|
||||
)
|
||||
throws InterruptedException,
|
||||
E {
|
||||
public static <E extends Exception> void waitAndInvoke(ThrowingRunnable<E> task) throws InterruptedException, E {
|
||||
HANDLER.waitAndInvoke(task);
|
||||
}
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend;
|
||||
|
||||
import static org.lwjgl.glfw.GLFW.*;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend;
|
||||
|
||||
import static org.lwjgl.opengl.GL15.GL_DYNAMIC_DRAW;
|
||||
@ -23,9 +23,7 @@ import static org.lwjgl.opengl.GL15.GL_STATIC_DRAW;
|
||||
import static org.lwjgl.opengl.GL15.GL_STREAM_DRAW;
|
||||
|
||||
public enum Usage { // TODO add _COPY and _READ, pref. as another enum
|
||||
STATIC(GL_STATIC_DRAW),
|
||||
DYNAMIC(GL_DYNAMIC_DRAW),
|
||||
STREAM(GL_STREAM_DRAW);
|
||||
STATIC(GL_STATIC_DRAW), DYNAMIC(GL_DYNAMIC_DRAW), STREAM(GL_STREAM_DRAW);
|
||||
|
||||
private final int glCode;
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend;
|
||||
|
||||
import static org.lwjgl.opengl.GL20.*;
|
||||
@ -28,8 +28,7 @@ import ru.windcorp.progressia.client.graphics.backend.OpenGLObjectTracker.OpenGL
|
||||
public class VertexBufferObject implements OpenGLDeletable {
|
||||
|
||||
public static enum BindTarget {
|
||||
ARRAY(GL_ARRAY_BUFFER),
|
||||
ELEMENT_ARRAY(GL_ELEMENT_ARRAY_BUFFER);
|
||||
ARRAY(GL_ARRAY_BUFFER), ELEMENT_ARRAY(GL_ELEMENT_ARRAY_BUFFER);
|
||||
|
||||
private final int glCode;
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend.shaders;
|
||||
|
||||
import ru.windcorp.progressia.common.resource.Resource;
|
||||
@ -32,12 +32,7 @@ public class CombinedShader extends Shader {
|
||||
for (int i = 1; i < resources.length; ++i) {
|
||||
if (ShaderType.guessByResourceName(resources[i]) != first) {
|
||||
throw new IllegalArgumentException(
|
||||
"Deduced shader types of "
|
||||
+ resources[0]
|
||||
+ " and "
|
||||
+ resources[i]
|
||||
+ " differ"
|
||||
);
|
||||
"Deduced shader types of " + resources[0] + " and " + resources[i] + " differ");
|
||||
}
|
||||
}
|
||||
|
||||
@ -71,19 +66,8 @@ public class CombinedShader extends Shader {
|
||||
if (contents.codePointAt(versionIndex) == '#') {
|
||||
final String versionAnnotation = "#version ";
|
||||
|
||||
if (
|
||||
contents.regionMatches(
|
||||
versionIndex,
|
||||
versionAnnotation,
|
||||
0,
|
||||
versionAnnotation.length()
|
||||
)
|
||||
) {
|
||||
contents = contents.substring(
|
||||
versionIndex
|
||||
+ versionAnnotation.length()
|
||||
+ "120".length()
|
||||
);
|
||||
if (contents.regionMatches(versionIndex, versionAnnotation, 0, versionAnnotation.length())) {
|
||||
contents = contents.substring(versionIndex + versionAnnotation.length() + "120".length());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend.shaders;
|
||||
|
||||
import static org.lwjgl.opengl.GL11.*;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend.shaders;
|
||||
|
||||
import static org.lwjgl.opengl.GL11.*;
|
||||
@ -57,10 +57,7 @@ public class Shader implements OpenGLDeletable {
|
||||
if (resource.contains("fsh"))
|
||||
return FRAGMENT;
|
||||
|
||||
throw new IllegalArgumentException(
|
||||
"Cannot deduce shader type from resource name \"" +
|
||||
resource + "\""
|
||||
);
|
||||
throw new IllegalArgumentException("Cannot deduce shader type from resource name \"" + resource + "\"");
|
||||
}
|
||||
}
|
||||
|
||||
@ -90,10 +87,7 @@ public class Shader implements OpenGLDeletable {
|
||||
}
|
||||
|
||||
public Shader(String resource) {
|
||||
this(
|
||||
ShaderType.guessByResourceName(resource),
|
||||
getShaderResource(resource).readAsString()
|
||||
);
|
||||
this(ShaderType.guessByResourceName(resource), getShaderResource(resource).readAsString());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend.shaders.attributes;
|
||||
|
||||
import ru.windcorp.progressia.client.graphics.backend.shaders.Program;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend.shaders.attributes;
|
||||
|
||||
import static org.lwjgl.opengl.GL11.*;
|
||||
@ -51,104 +51,29 @@ public class AttributeVertexArray extends Attribute {
|
||||
}
|
||||
}
|
||||
|
||||
public void set(
|
||||
int size,
|
||||
boolean normalized,
|
||||
int stride,
|
||||
ByteBuffer pointer
|
||||
) {
|
||||
glVertexAttribPointer(
|
||||
handle,
|
||||
size,
|
||||
GL_BYTE,
|
||||
normalized,
|
||||
stride,
|
||||
pointer
|
||||
);
|
||||
public void set(int size, boolean normalized, int stride, ByteBuffer pointer) {
|
||||
glVertexAttribPointer(handle, size, GL_BYTE, normalized, stride, pointer);
|
||||
}
|
||||
|
||||
public void set(
|
||||
int size,
|
||||
boolean normalized,
|
||||
int stride,
|
||||
FloatBuffer pointer
|
||||
) {
|
||||
glVertexAttribPointer(
|
||||
handle,
|
||||
size,
|
||||
GL_FLOAT,
|
||||
normalized,
|
||||
stride,
|
||||
pointer
|
||||
);
|
||||
public void set(int size, boolean normalized, int stride, FloatBuffer pointer) {
|
||||
glVertexAttribPointer(handle, size, GL_FLOAT, normalized, stride, pointer);
|
||||
}
|
||||
|
||||
public void set(
|
||||
int size,
|
||||
boolean normalized,
|
||||
int stride,
|
||||
IntBuffer pointer
|
||||
) {
|
||||
glVertexAttribPointer(
|
||||
handle,
|
||||
size,
|
||||
GL_INT,
|
||||
normalized,
|
||||
stride,
|
||||
pointer
|
||||
);
|
||||
public void set(int size, boolean normalized, int stride, IntBuffer pointer) {
|
||||
glVertexAttribPointer(handle, size, GL_INT, normalized, stride, pointer);
|
||||
}
|
||||
|
||||
public void set(
|
||||
int size,
|
||||
boolean normalized,
|
||||
int stride,
|
||||
ShortBuffer pointer
|
||||
) {
|
||||
glVertexAttribPointer(
|
||||
handle,
|
||||
size,
|
||||
GL_SHORT,
|
||||
normalized,
|
||||
stride,
|
||||
pointer
|
||||
);
|
||||
public void set(int size, boolean normalized, int stride, ShortBuffer pointer) {
|
||||
glVertexAttribPointer(handle, size, GL_SHORT, normalized, stride, pointer);
|
||||
}
|
||||
|
||||
public void set(
|
||||
int size,
|
||||
int type,
|
||||
boolean normalized,
|
||||
int stride,
|
||||
long pointer
|
||||
) {
|
||||
glVertexAttribPointer(
|
||||
handle,
|
||||
size,
|
||||
type,
|
||||
normalized,
|
||||
stride,
|
||||
pointer
|
||||
);
|
||||
public void set(int size, int type, boolean normalized, int stride, long pointer) {
|
||||
glVertexAttribPointer(handle, size, type, normalized, stride, pointer);
|
||||
}
|
||||
|
||||
public void set(
|
||||
int size,
|
||||
int type,
|
||||
boolean normalized,
|
||||
int stride,
|
||||
VertexBufferObject vbo,
|
||||
long offset
|
||||
) {
|
||||
public void set(int size, int type, boolean normalized, int stride, VertexBufferObject vbo, long offset) {
|
||||
glBindBuffer(GL_ARRAY_BUFFER, vbo.getHandle());
|
||||
glVertexAttribPointer(
|
||||
handle,
|
||||
size,
|
||||
type,
|
||||
normalized,
|
||||
stride,
|
||||
offset
|
||||
);
|
||||
glVertexAttribPointer(handle, size, type, normalized, stride, offset);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend.shaders.uniforms;
|
||||
|
||||
import ru.windcorp.progressia.client.graphics.backend.shaders.Program;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend.shaders.uniforms;
|
||||
|
||||
import static org.lwjgl.opengl.GL20.*;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend.shaders.uniforms;
|
||||
|
||||
import static org.lwjgl.opengl.GL20.*;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend.shaders.uniforms;
|
||||
|
||||
import static org.lwjgl.opengl.GL20.*;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend.shaders.uniforms;
|
||||
|
||||
import static org.lwjgl.opengl.GL20.*;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
package ru.windcorp.progressia.client.graphics.backend.shaders.uniforms;
|
||||
|
||||
import static org.lwjgl.opengl.GL20.*;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user