Рейтрейсинг блока под курсором мыши [DIFFICULTY: IMPOSIBLAH]

Репортирую.

Код:
java.lang.IllegalArgumentException: Number of remaining buffer elements is 4, must be at least 16. Because at most 16 elements can be returned, a buffer with at least 16 elements is required, regardless of actual returned element count
    at org.lwjgl.BufferChecks.throwBufferSizeException(BufferChecks.java:162)
    at org.lwjgl.BufferChecks.checkBufferSize(BufferChecks.java:189)
    at org.lwjgl.BufferChecks.checkBuffer(BufferChecks.java:244)
    at org.lwjgl.opengl.GL11.glGetInteger(GL11.java:1377)
    at desu.GLDude.calcBlockMouseOver(GLDude.java:27)
GLDude.java:27 здесь у нас GL11.glGetInteger(GL11.GL_VIEWPORT, viewportBuf);Я попробовал изменить размер буфера вьюпорта на 16, тогда координаты у МОПа были от -1 до 0.

Помосчь!

З.Ы. Вызываю с эвента RenderWorldLastEvent
 
Отдебажил, теперь работает. Проблемы было две.
1) В lwjgl минимальный размер буфера для glGetInteger - 16, даже если столько не нужно (говорят, баг, который поправят в lwjgl 3)
2) Я забыл, что Vec3#addVector() не модифицирует существующий вектор, а создает новый. 

Поправил сообщение с кодом.
 
desu написал(а):
GloomyFolken написал(а):
Много интересующихся видать. Хехе
Ты накрутил.Как только ты создал тему сразу зашло 414 гостей.Сначала было 414 просмотров а потом 900 с чем то.И потом дошло до 1000.Так не бывает в первые минуты темы.Даж скрин есть 
9b9044c949.png

а может и не ты
 
Код:
    public static void main (String[] args) throws Exception {
        final URL url = new URL("http://forum.mcmodding.ru/viewtopic.php?id=2426");
        for (int i = 0; i < 50; i++){
            new Thread(){
                public void run() {
                    try {
                        for (int i = 0; i < 200; i++){
                            URLConnection con = url.openConnection();
                            con.getInputStream().read();
                        }
                    } catch (Exception e){}
                }
            }.start();
        }
    }
Запустил с двух хецнеровских машин xD
Ток чот я засцал, когда увидел "Resource limit is reached"
[merge_posts_bbcode]Добавлено: 23.05.2015 10:02:53[/merge_posts_bbcode]

Только чот у меня не получается сделать на сайте надпись "форум просматривает 100500 гостей"... Чувак, ты с ботнета накручивал, что ли?

[merge_posts_bbcode]Добавлено: 23.05.2015 10:14:11[/merge_posts_bbcode]

Ну, самая популярная тема на форуме готова xD
 
50 поток же. В очередь добавь. 3 потока с очередями. А вообще не надо обращать нато внимание,вот я не заметил
 
Ой, да какая там разница, сколько потоков. Сайта всё равно не хватает. Просмотры росли с одинаковой скоростью вне зависимости от того, где я запускал: на одной машинке или на трёх.
 
GloomyFolken написал(а):
Конкретно здесь матан не особо нужен, потому что задачу уже десять раз решили до нас :D
Попробовал портировать на lwjgl, но не тестил. Надеюсь, сможешь отдебажить.
Код:
//не стоит каждый раз создавать новый буфер, это чревато проблемами с производительностью
    private static IntBuffer viewportBuf = BufferUtils.createIntBuffer(16);
    private static FloatBuffer projectionBuf = BufferUtils.createFloatBuffer(16);
    private static FloatBuffer modelviewBuf = BufferUtils.createFloatBuffer(16);

    /**
     * Метод использует текущие матрицу проекции и modelview матрицу, так что вызывать
     * его во время отрисовки ГУИ - не дело. Вызывай в RenderWorldLastEvent, например
     */
    public MovingObjectPosition calcBlockMouseOver(World world){
        GL11.glGetInteger(GL11.GL_VIEWPORT, viewportBuf);
        GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projectionBuf);
        GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, modelviewBuf);

        float vx = Mouse.getX();
        // я не очень помню, где находится 0 по оси Y: сверху или снизу.
        // если сверху, то vy = mc.displayHeight - Mouse.getY().
        float vy = Mouse.getY();

        // этот буфер не нативный, так что всё ОК
        FloatBuffer resultBuf = FloatBuffer.allocate(3);

        // В той статье предполагается ставить z на -1,
        // но я не уверен, что оно будет правильно работать.
        // Всё-таки миниальная глубина - это 0, а не -1. Решай сам, кому верить 
        Project.gluUnProject(vx, vy, -1, modelviewBuf, projectionBuf, viewportBuf, resultBuf);
        Vec3 p1 = Vec3.createVectorHelper(resultBuf.get(0), resultBuf.get(1), resultBuf.get(2));

        Project.gluUnProject(vx, vy, 1, modelviewBuf, projectionBuf, viewportBuf, resultBuf);
        Vec3 p2 = Vec3.createVectorHelper(resultBuf.get(0), resultBuf.get(1), resultBuf.get(2));
        
        //И всё бы ничего, но p1 и p2 центрированы то ли к камере, то ли к голове персонажа.
        //Склоняюсь ко второму варианту. Поправим это.
        
        p1 = p1.addVector(RenderManager.renderPosX, RenderManager.renderPosY, RenderManager.renderPosZ);
        p2 = p2.addVector(RenderManager.renderPosX, RenderManager.renderPosY, RenderManager.renderPosZ);
        
        return world.clip(p1, p2);
    }
Просто блин от души в обе щёчки целую
 
Назад
Сверху