⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shaderprogramretained.java

📁 JAVA3D矩陈的相关类
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
	boolean loadShaderProgram = false; // flag indicating whether to reload all shaderProgram states        if (getShaderProgramData(cvRdrIndex).getShaderProgramId() == null) {            loadShaderProgram = true;        }        	//System.err.println(".... loadShaderProgram = " + loadShaderProgram);	//System.err.println(".... resourceCreationMask= " + resourceCreationMask);         ShaderError err = null;        boolean errorOccurred = false;	if (loadShaderProgram) {            if (useSharedCtx) {	    // TODO : Need to test useSharedCtx case. ** Untested case **		cv.makeCtxCurrent(cv.screen.renderer.sharedCtx);            }                    // Create shader resources if not already done            for(int i=0; i < shaders.length; i++) {                // Create ShaderProgramData object for this canvas/renderer if it doesn't already exist                shaders[i].createShaderData(cvRdrIndex, ctxTimeStamp);                if (shaders[i].compileErrorOccurred) {                    errorOccurred = true;                }                else {                    err = createShader(cv, cvRdrIndex, shaders[i]);                    if (err != null) {                        err.setShaderProgram((ShaderProgram)this.source);                        err.setShader((Shader)shaders[i].source);                        err.setCanvas3D(cv);                        notifyErrorListeners(cv, err);                        errorOccurred = true;                    }                    else {                        err = compileShader(cv, cvRdrIndex, shaders[i]);                        if (err != null) {                            err.setShaderProgram((ShaderProgram)this.source);                            err.setShader((Shader)shaders[i].source);                            err.setCanvas3D(cv);                            notifyErrorListeners(cv, err);                            destroyShader(cv, cvRdrIndex, shaders[i]);                            shaders[i].compileErrorOccurred = true;                            errorOccurred = true;                        }                    }                }            }                        // Create shader program            if (!errorOccurred) {                err = createShaderProgram(cv, cvRdrIndex);                if (err != null) {                    err.setShaderProgram((ShaderProgram)this.source);                    err.setCanvas3D(cv);                    notifyErrorListeners(cv, err);                    errorOccurred = true;                }            }                        boolean linked = getShaderProgramData(cvRdrIndex).isLinked();            if (!linked) {                // Bind vertex attribute names                if (!errorOccurred) {                    if (vertexAttrNames != null) {//                        System.err.println("vertexAttrNames.length = " + vertexAttrNames.length);                        for (int i = 0; i < vertexAttrNames.length; i++) {                            err = bindVertexAttrName(cv, cvRdrIndex, vertexAttrNames[i], i);                            // Report non-fatal error, if one was detected                            if (err != null) {                                err.setShaderProgram((ShaderProgram)this.source);                                err.setCanvas3D(cv);                                notifyErrorListeners(cv, err);                            }                        }                    }                }                                // Link shader program                if (!errorOccurred) {                    err = linkShaderProgram(cv, cvRdrIndex, shaders);                    if (err != null) {                        err.setShaderProgram((ShaderProgram)this.source);                        err.setCanvas3D(cv);                        notifyErrorListeners(cv, err);                        destroyShaderProgram(cv, cvRdrIndex);                        linkErrorOccurred = true;                        errorOccurred = true;                    }                }                                // lookup vertex attribute names                if (!errorOccurred) {                    if (vertexAttrNames != null) {                        lookupVertexAttrNames(cv, cvRdrIndex, vertexAttrNames);                    }                }                                // Lookup shader attribute names                if (!errorOccurred) {                    if (shaderAttrNames != null) {//                        System.err.println("shaderAttrNames.length = " + shaderAttrNames.length);                        lookupShaderAttrNames(cv, cvRdrIndex, shaderAttrNames);                    }                }            }                        // Restore current context if we changed it to the shareCtx            if (useSharedCtx) {                cv.makeCtxCurrent(cv.ctx);            }	               // If compilation or link error occured, disable shader program and return            if (errorOccurred) {                disableShaderProgram(cv);                return;            }        }         // Now we can enable the shader program	enableShaderProgram(cv, cvRdrIndex);    }    /**     * Update native value for ShaderAttributeValue class     */    ShaderError setUniformAttrValue(Context ctx, ShaderProgramId shaderProgramId,            ShaderAttrLoc loc, ShaderAttributeValueRetained sav) {	switch (sav.getClassType()) {	case ShaderAttributeObjectRetained.TYPE_INTEGER:	    return setUniform1i(ctx, shaderProgramId, loc,				((int[])sav.attrWrapper.getRef())[0]);	case ShaderAttributeObjectRetained.TYPE_FLOAT:	    return setUniform1f(ctx, shaderProgramId, loc,				((float[])sav.attrWrapper.getRef())[0]);	case ShaderAttributeObjectRetained.TYPE_TUPLE2I:	    return setUniform2i(ctx, shaderProgramId, loc,				(int[])sav.attrWrapper.getRef());	case ShaderAttributeObjectRetained.TYPE_TUPLE2F:	    return setUniform2f(ctx, shaderProgramId, loc,				(float[])sav.attrWrapper.getRef());	case ShaderAttributeObjectRetained.TYPE_TUPLE3I:	    return setUniform3i(ctx, shaderProgramId, loc,				(int[])sav.attrWrapper.getRef());	case ShaderAttributeObjectRetained.TYPE_TUPLE3F:	    return setUniform3f(ctx, shaderProgramId, loc,				(float[])sav.attrWrapper.getRef());	case ShaderAttributeObjectRetained.TYPE_TUPLE4I:	    return setUniform4i(ctx, shaderProgramId, loc,				(int[])sav.attrWrapper.getRef());	case ShaderAttributeObjectRetained.TYPE_TUPLE4F:	    return setUniform4f(ctx, shaderProgramId, loc,				(float[])sav.attrWrapper.getRef());	case ShaderAttributeObjectRetained.TYPE_MATRIX3F:	    return setUniformMatrix3f(ctx, shaderProgramId, loc,				      (float[])sav.attrWrapper.getRef());	case ShaderAttributeObjectRetained.TYPE_MATRIX4F:	    return setUniformMatrix4f(ctx, shaderProgramId, loc,				      (float[])sav.attrWrapper.getRef());	default:	    // Should never get here	    assert false : "Unrecognized ShaderAttributeValue classType";	    return null;	}    }         /**     * Update native value for ShaderAttributeArray class     */    ShaderError setUniformAttrArray(Context ctx, ShaderProgramId shaderProgramId,            ShaderAttrLoc loc, ShaderAttributeArrayRetained saa) {           switch (saa.getClassType()) {            case ShaderAttributeObjectRetained.TYPE_INTEGER:                return  setUniform1iArray(ctx, shaderProgramId, loc, saa.length(),                        ((int[])saa.attrWrapper.getRef()));                            case ShaderAttributeObjectRetained.TYPE_FLOAT:                return setUniform1fArray(ctx, shaderProgramId, loc, saa.length(),                        ((float[])saa.attrWrapper.getRef()));                            case ShaderAttributeObjectRetained.TYPE_TUPLE2I:                return setUniform2iArray(ctx, shaderProgramId, loc, saa.length(),                        (int[])saa.attrWrapper.getRef());                            case ShaderAttributeObjectRetained.TYPE_TUPLE2F:                return setUniform2fArray(ctx, shaderProgramId, loc, saa.length(),                        (float[])saa.attrWrapper.getRef());                            case ShaderAttributeObjectRetained.TYPE_TUPLE3I:                return setUniform3iArray(ctx, shaderProgramId, loc, saa.length(),                        (int[])saa.attrWrapper.getRef());                            case ShaderAttributeObjectRetained.TYPE_TUPLE3F:                return setUniform3fArray(ctx, shaderProgramId, loc, saa.length(),                        (float[])saa.attrWrapper.getRef());                            case ShaderAttributeObjectRetained.TYPE_TUPLE4I:                return setUniform4iArray(ctx, shaderProgramId, loc, saa.length(),                        (int[])saa.attrWrapper.getRef());                            case ShaderAttributeObjectRetained.TYPE_TUPLE4F:                return setUniform4fArray(ctx, shaderProgramId, loc, saa.length(),                        (float[])saa.attrWrapper.getRef());                            case ShaderAttributeObjectRetained.TYPE_MATRIX3F:                return setUniformMatrix3fArray(ctx, shaderProgramId, loc, saa.length(),                        (float[])saa.attrWrapper.getRef());                            case ShaderAttributeObjectRetained.TYPE_MATRIX4F:                return setUniformMatrix4fArray(ctx, shaderProgramId, loc, saa.length(),                        (float[])saa.attrWrapper.getRef());                            default:                // Should never get here                assert false : "Unrecognized ShaderAttributeArray classType";                return null;        }        }            void setShaderAttributes(Canvas3D cv, ShaderAttributeSetRetained attributeSet) {        final boolean useSharedCtx = cv.useSharedCtx && cv.screen.renderer.sharedCtx != null;        final int cvRdrIndex = useSharedCtx ? cv.screen.renderer.rendererId : cv.canvasId;                ShaderProgramData spData = getShaderProgramData(cvRdrIndex);                // Just return if shader program wasn't linked successfully        if (!spData.isLinked()) {            return;        }                ShaderProgramId shaderProgramId = spData.getShaderProgramId();                Iterator attrs = attributeSet.getAttrs().values().iterator();        while (attrs.hasNext()) {            ShaderError err = null;            ShaderAttributeRetained saRetained = (ShaderAttributeRetained)attrs.next();            // Lookup attribute info for the specified attrName; null means            // that the name does not appear in the ShaderProgram, so we will            // report an error.            AttrNameInfo attrNameInfo = spData.getAttrNameInfo(saRetained.getAttributeName());            if(attrNameInfo == null) {//                System.err.println("ShaderProgramRetained : attrLocation (" + saRetained.getAttributeName() + ") is null.");                String errMsg = "Attribute name not set in ShaderProgram: " + saRetained.getAttributeName(); // TODO: I18N                err = new ShaderError(ShaderError.SHADER_ATTRIBUTE_NAME_NOT_SET_ERROR, errMsg);            } else {                ShaderAttrLoc loc = attrNameInfo.getLocation();                if (loc != null) {                    if (saRetained instanceof ShaderAttributeValueRetained) {                        ShaderAttributeValueRetained savRetained = (ShaderAttributeValueRetained)saRetained;                        if (attrNameInfo.isArray() ||                                (savRetained.getClassType() != attrNameInfo.getType())) {                            String errMsg = "Attribute type mismatch: " + savRetained.getAttributeName(); // TODO: I18N                            err = new ShaderError(ShaderError.SHADER_ATTRIBUTE_TYPE_ERROR, errMsg);                        }                        else {                            err = setUniformAttrValue(cv.ctx, shaderProgramId, loc, savRetained);                        }                    } else if (saRetained instanceof ShaderAttributeArrayRetained) {                        ShaderAttributeArrayRetained saaRetained = (ShaderAttributeArrayRetained)saRetained;                        if (!attrNameInfo.isArray() ||                                (saaRetained.getClassType() != attrNameInfo.getType())) {                            String errMsg = "Attribute type mismatch: " + saaRetained.getAttributeName(); // TODO: I18N                            err = new ShaderError(ShaderError.SHADER_ATTRIBUTE_TYPE_ERROR, errMsg);                        }                        else {                            err = setUniformAttrArray(cv.ctx, shaderProgramId, loc, saaRetained);                        }                    } else if (saRetained instanceof ShaderAttributeBindingRetained) {                        assert false;                        throw new RuntimeException("not implemented");                    } else {                        assert false;                    }                }            }                        if (err != null) {                // Before reporting the ShaderAttribute error, check                // whether it has already been reported for this ShaderProgram                if (shaderAttrErrorSet == null) {                    shaderAttrErrorSet = new HashSet();                }                if (shaderAttrErrorSet.add(saRetained.source)) {                    err.setShaderProgram((ShaderProgram)this.source);                    err.setShaderAttributeSet((ShaderAttributeSet)attributeSet.source);                    err.setShaderAttribute((ShaderAttribute)saRetained.source);                    err.setCanvas3D(cv);                    notifyErrorListeners(cv, err);                }            }        }    }        class ShaderProgramData extends Object {        // issue 378 - time stamp of context creation for this Canvas        private long ctxTimeStamp;	// shaderProgramId use by native code. 	private ShaderProgramId shaderProgramId = null;		// linked flag for native.	private boolean linked = false;		// A map of locations for ShaderAttributes.	private HashMap attrNameInfoMap = new HashMap();	/** ShaderProgramData Constructor */	ShaderProgramData() {	}                void reset() {            ctxTimeStamp = 0L;            shaderProgramId = null;            linked = false;            attrNameInfoMap.clear();        }        long getCtxTimeStamp() {            return ctxTimeStamp;        }        void setCtxTimeStamp(long ctxTimeStamp) {            this.ctxTimeStamp = ctxTimeStamp;        }	void setShaderProgramId(ShaderProgramId shaderProgramId) {	    this.shaderProgramId = shaderProgramId;	}	ShaderProgramId getShaderProgramId() {	    return this.shaderProgramId;	}	void setLinked(boolean linked) {	    this.linked = linked;	}	boolean isLinked() {	    return linked;	}	void setAttrNameInfo(String shaderAttribute, AttrNameInfo attrNameInfo) {	    assert(shaderAttribute != null);	    attrNameInfoMap.put(shaderAttribute, attrNameInfo);	}	AttrNameInfo getAttrNameInfo(String shaderAttribute) {	    return  (AttrNameInfo) attrNameInfoMap.get(shaderAttribute);	}    }        // Data associated with an attribute name    class AttrNameInfo {        void setLocation(ShaderAttrLoc loc) {            this.loc = loc;        }        ShaderAttrLoc getLocation() {            return loc;        }        void setType(int type) {            this.type = type;        }        int getType() {            return type;        }                boolean isArray() {            return isArray;        }        void setArray(boolean isArray) {            this.isArray = isArray;        }        // Location of attribute name in linked shader program        private ShaderAttrLoc loc;        // boolean indicating whether the attribute is an array        private boolean isArray;                // type of shader attribute        private int type;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -